dirk-cfx-react 1.1.46 → 1.1.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/index.cjs +8 -3
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.cts +2 -1
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.js +8 -4
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.cjs +9 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/index.cjs +25 -0
- package/dist/providers/index.cjs.map +1 -1
- package/dist/providers/index.js +26 -1
- package/dist/providers/index.js.map +1 -1
- package/package.json +1 -1
package/dist/providers/index.cjs
CHANGED
|
@@ -145,6 +145,8 @@ var theme_default = theme;
|
|
|
145
145
|
|
|
146
146
|
// src/utils/misc.ts
|
|
147
147
|
var isEnvBrowser = () => !window.invokeNative;
|
|
148
|
+
var noop = () => {
|
|
149
|
+
};
|
|
148
150
|
var useSettings = zustand.create(() => ({
|
|
149
151
|
currency: "$",
|
|
150
152
|
game: "fivem",
|
|
@@ -202,6 +204,28 @@ function mergeMantineThemeSafe(base, custom, override) {
|
|
|
202
204
|
}
|
|
203
205
|
};
|
|
204
206
|
}
|
|
207
|
+
var _scriptSettingsUpdaters = [];
|
|
208
|
+
function _dispatchScriptSettingsUpdate(data) {
|
|
209
|
+
_scriptSettingsUpdaters.forEach((fn) => fn(data));
|
|
210
|
+
}
|
|
211
|
+
var useNuiEvent = (action, handler) => {
|
|
212
|
+
const savedHandler = React.useRef(noop);
|
|
213
|
+
React.useEffect(() => {
|
|
214
|
+
savedHandler.current = handler;
|
|
215
|
+
}, [handler]);
|
|
216
|
+
React.useEffect(() => {
|
|
217
|
+
const eventListener = (event) => {
|
|
218
|
+
const { action: eventAction, data } = event.data;
|
|
219
|
+
if (savedHandler.current) {
|
|
220
|
+
if (eventAction === action) {
|
|
221
|
+
savedHandler.current(data);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
window.addEventListener("message", eventListener);
|
|
226
|
+
return () => window.removeEventListener("message", eventListener);
|
|
227
|
+
}, [action]);
|
|
228
|
+
};
|
|
205
229
|
var DirkErrorBoundary = class extends React__default.default.Component {
|
|
206
230
|
constructor() {
|
|
207
231
|
super(...arguments);
|
|
@@ -281,6 +305,7 @@ function DirkProvider({ children, overideResourceName, themeOverride }) {
|
|
|
281
305
|
console.error("Failed to fetch initial settings within dirk-cfx-react:", err);
|
|
282
306
|
});
|
|
283
307
|
}, []);
|
|
308
|
+
useNuiEvent("UPDATE_SCRIPT_SETTINGS", _dispatchScriptSettingsUpdate);
|
|
284
309
|
const mergedTheme = React.useMemo(
|
|
285
310
|
() => mergeMantineThemeSafe(
|
|
286
311
|
{ ...theme_default, primaryColor, primaryShade },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/theme.ts","../../src/utils/misc.ts","../../src/utils/useSettings.ts","../../src/utils/fetchNui.ts","../../src/utils/mergeMantineTheme.ts","../../src/providers/DirkErrorBoundary.tsx","../../src/providers/DirkProvider.tsx"],"names":["createTheme","theme","create","React","error","jsx","Box","jsxs","Stack","Title","Text","Code","library","fas","far","fab","useLayoutEffect","useEffect","useMemo","BackgroundImage","MantineProvider"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ColorInput, createTheme, MantineTheme, MultiSelect, NumberInput, TextInput } from \"@mantine/core\";\r\n\r\nexport const label = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n fontFamily: 'Akrobat Bold',\r\n letterSpacing: '0.05em',\r\n textTransform: 'uppercase', \r\n};\r\nexport const error = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n fontFamily: 'Akrobat Regular',\r\n};\r\nexport const description = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n};\r\n\r\nexport const genericInputStyles = {\r\n styles: {\r\n label: label,\r\n error: error,\r\n description: description,\r\n \r\n input:{\r\n backgroundColor: 'rgba(76, 76, 76, 0.3)', \r\n minHeight: '4vh',\r\n },\r\n },\r\n};\r\n\r\nconst theme = createTheme({\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n defaultRadius: \"xs\",\r\n fontFamily: \"Akrobat Regular, sans-serif\",\r\n\r\n radius:{\r\n xxs: '0.3vh',\r\n xs: '0.5vh',\r\n sm: '0.75vh',\r\n md: '1vh',\r\n lg: '1.5vh',\r\n xl: '2vh',\r\n xxl: '3vh',\r\n },\r\n\r\n fontSizes: {\r\n xxs: '1.2vh',\r\n xs: '1.5vh',\r\n sm: '1.8vh',\r\n md: '2.2vh',\r\n lg: '2.8vh',\r\n xl: '3.3vh',\r\n xxl: '3.8vh',\r\n },\r\n\r\n lineHeights: {\r\n xxs: '1.4vh',\r\n xs: '1.8vh',\r\n sm: '2.2vh',\r\n md: '2.8vh',\r\n lg: '3.3vh',\r\n xl: '3.8vh',\r\n },\r\n\r\n spacing:{\r\n xxs: '0.5vh',\r\n xs: '0.75vh',\r\n sm: '1.5vh',\r\n md: '2vh',\r\n lg: '3vh',\r\n xl: '4vh',\r\n xxl: '5vh',\r\n },\r\n\r\n components:{\r\n Progress:{\r\n styles:{\r\n label: {\r\n fontFamily: 'Akrobat Bold',\r\n letterSpacing: '0.05em',\r\n textTransform: 'uppercase', \r\n },\r\n\r\n root:{\r\n backgroundColor: 'rgba(77, 77, 77, 0.4)',\r\n },\r\n \r\n }\r\n },\r\n \r\n \r\n Input: genericInputStyles,\r\n TextInput: genericInputStyles,\r\n NumberInput: genericInputStyles,\r\n Select: genericInputStyles,\r\n MultiSelect: genericInputStyles, \r\n Textarea: genericInputStyles,\r\n ColorInput: genericInputStyles,\r\n DateInput: genericInputStyles,\r\n\r\n Pill: {\r\n styles: (theme: MantineTheme) => ({\r\n root: {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: 'rgba(76, 76, 76, 0.3)',\r\n height: 'fit-content',\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.05em',\r\n fontFamily: 'Akrobat Bold',\r\n fontSize: '1.25vh',\r\n borderRadius: theme.defaultRadius,\r\n paddingBottom: '0.5vh',\r\n paddingTop: '0.5vh',\r\n }\r\n })\r\n },\r\n\r\n },\r\n\r\n colors: {\r\n\r\n dirk:[\r\n \"#ffffff\",\r\n \"#f3fce9\",\r\n \"#dbf5bd\",\r\n \"#c3ee91\",\r\n \"#ace765\",\r\n \"#94e039\",\r\n \"#7ac61f\",\r\n \"#5f9a18\",\r\n \"#29420a\",\r\n \"#446e11\",\r\n ],\r\n },\r\n});\r\n\r\n\r\nexport default theme;","export const isEnvBrowser = (): boolean => !(window as any).invokeNative;\r\n\r\n// Basic no operation function\r\nexport const noop = () => {};\r\n\r\nexport const splitFAString = (faString:string) => {\r\n const [prefix, newIcon] = faString.split('-');\r\n if (!prefix || !newIcon) return {prefix: 'fas', newIcon: 'question'};\r\n return {prefix, newIcon};\r\n}\r\n\r\nexport const numberToRoman = (num:number) => {\r\n const romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX'] \r\n return romanNumerals[num]\r\n}\r\n\r\nexport const copyToClipboard = (text:string) => {\r\n const el = document.createElement('textarea');\r\n el.value = text;\r\n document.body.appendChild(el);\r\n el.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(el);\r\n}\r\n\r\nexport const openLink = (url:string) => {\r\n if (isEnvBrowser()) {\r\n window.open(url, '_blank');\r\n } else {\r\n // @ts-expect-error -- invokeNative exists in NUI\r\n window.invokeNative('openLink', url);\r\n } \r\n}","import { MantineColorsTuple } from \"@mantine/core\";\r\nimport { create } from \"zustand\";\r\n\r\nexport type SettingsState = {\r\n game: \"fivem\" | \"rdr3\";\r\n currency: string;\r\n primaryColor: string;\r\n primaryShade: number;\r\n itemImgPath: string;\r\n customTheme?: MantineColorsTuple;\r\n overideResourceName?: string;\r\n};\r\n\r\nexport const useSettings = create<SettingsState>(() => ({\r\n currency: \"$\",\r\n game: \"fivem\",\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n itemImgPath: \"\",\r\n customTheme: [\r\n \"#f0f4ff\",\r\n \"#d9e3ff\",\r\n \"#bfcfff\",\r\n \"#a6bbff\",\r\n \"#8ca7ff\",\r\n \"#7393ff\",\r\n \"#5a7fff\",\r\n \"#406bff\",\r\n \"#2547ff\",\r\n \"#0b33ff\",\r\n ],\r\n}));\r\n\r\n// registerInitialFetch<Partial<SettingsState>>('GET_SETTINGS', undefined).then((data) => {\r\n// if (!data) {\r\n// console.warn('No settings data received from GET_SETTINGS fetch.');\r\n// return;\r\n// }\r\n// useSettings.setState({\r\n// ...data,\r\n// });\r\n// })\r\n","import { useEffect } from \"react\";\r\nimport { isEnvBrowser } from \"./misc\";\r\nimport { useSettings } from \"./useSettings\";\r\n\r\n/**\r\n * Simple wrapper around fetch API tailored for CEF/NUI use.\r\n */\r\nexport async function fetchNui<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T,\r\n): Promise<T> {\r\n const options = {\r\n method: \"post\",\r\n headers: {\r\n \"Content-Type\": \"application/json; charset=UTF-8\",\r\n },\r\n body: JSON.stringify(data),\r\n };\r\n\r\n if (isEnvBrowser() && mockData !== undefined) return mockData;\r\n if (isEnvBrowser() && mockData === undefined) {\r\n console.warn(\r\n `[fetchNui] Called fetchNui for event \"${eventName}\" in browser environment without mockData. Returning empty object.`,\r\n );\r\n return {} as T;\r\n }\r\n\r\n const overrideResourceName = useSettings.getState().overideResourceName;\r\n\r\n const resourceName = (window as any).GetParentResourceName\r\n ? (window as any).GetParentResourceName()\r\n : overrideResourceName ? overrideResourceName : \"dirk-cfx-react\";\r\n const resp = await fetch(`https://${resourceName}/${eventName}`, options);\r\n return await resp.json();\r\n}\r\n\r\n// -----------------------------\r\n// Initial fetch registration\r\n// -----------------------------\r\nexport type InitialFetch<T> = () => Promise<T>;\r\nexport const initialFetches: Record<string, InitialFetch<unknown>> = {};\r\n\r\n/**\r\n * Registers an initial fetch that automatically uses fetchNui.\r\n * Works like:\r\n * ```ts\r\n * registerInitialFetch<{ name: string }>(\"MY_EVENT_NAME\", undefined, { name: \"Mocky\" });\r\n * ```\r\n * and returns a Promise resolving to the same type as fetchNui.\r\n */\r\nexport async function registerInitialFetch<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T,\r\n): Promise<T> {\r\n const fetcher = () => fetchNui<T>(eventName, data, mockData);\r\n initialFetches[eventName] = fetcher;\r\n return fetcher(); // run immediately if needed\r\n}\r\n\r\n/**\r\n * Runs all registered initial fetches in parallel.\r\n */\r\nexport async function runFetches() {\r\n return Promise.all(\r\n Object.entries(initialFetches).map(async ([eventName, fetcher]) => {\r\n const data = await fetcher();\r\n return { eventName, data };\r\n }),\r\n );\r\n}\r\n\r\n/**\r\n * React hook to automatically run all registered fetches on mount.\r\n */\r\nexport const useAutoFetcher = () => {\r\n useEffect(() => {\r\n if (isEnvBrowser()) return;\r\n const run = async () => {\r\n const results = await runFetches();\r\n };\r\n run();\r\n }, []);\r\n};\r\n\r\n\r\nexport const fetchLuaTable = <T>(tableName: string, mockData?: T): Promise<T> => { \r\n return fetchNui<T>('FETCH_LUA_TABLE', { tableName }, mockData);\r\n} \r\n\r\nexport const registerInitialLuaTableFetch = <T>(tableName: string, mockData?: T): Promise<T> => { \r\n return registerInitialFetch<T>('FETCH_LUA_TABLE', { tableName }, mockData);\r\n} \r\n\r\n\r\n\r\n// useage example:\r\n// registerInitialLuaTableFetch<{ [key: string]: string }>('my_lua_table', { key1: 'value1', key2: 'value2' }); \r\n","import type { MantineColorsTuple, MantineThemeOverride } from \"@mantine/core\";\r\n\r\nconst isValidColorScale = (v: unknown): v is MantineColorsTuple =>\r\n Array.isArray(v) && v.length === 10 && v.every((shade) => typeof shade === \"string\");\r\n\r\nexport function mergeMantineThemeSafe(\r\n base: MantineThemeOverride,\r\n custom?: MantineColorsTuple,\r\n override?: MantineThemeOverride\r\n): MantineThemeOverride {\r\n const colors = { ...base.colors };\r\n\r\n if (custom && isValidColorScale(custom)) {\r\n colors[\"custom\"] = custom;\r\n } \r\n\r\n return {\r\n ...base,\r\n ...override,\r\n colors: {\r\n ...colors,\r\n ...(override?.colors ?? {}),\r\n },\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { Box, Code, Stack, Text, Title } from \"@mantine/core\";\r\n\r\ntype State = {\r\n error: Error | null;\r\n stack?: string;\r\n};\r\n\r\nexport class DirkErrorBoundary extends React.Component<\r\n { children: React.ReactNode },\r\n State\r\n> {\r\n state: State = { error: null, stack: undefined };\r\n\r\n static getDerivedStateFromError(error: Error) {\r\n // We can't get component stack here, so just store the error\r\n return { error };\r\n }\r\n\r\n componentDidCatch(error: Error, info: React.ErrorInfo) {\r\n console.group(\"🔥 Dirk UI Crash\");\r\n console.error(\"Error:\", error);\r\n console.error(\"Component Stack:\", info.componentStack);\r\n console.groupEnd();\r\n\r\n // Only log here, don't call setState — the error state is already captured\r\n }\r\n\r\n render() {\r\n if (!this.state.error) return this.props.children;\r\n\r\n return (\r\n <Box\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n width: \"100vw\",\r\n height: \"100vh\",\r\n background: \"rgba(10, 10, 12, 0.92)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"2rem\",\r\n zIndex: 999999,\r\n }}\r\n >\r\n <Box\r\n maw={900}\r\n w=\"100%\"\r\n p=\"lg\"\r\n style={{\r\n background: \"rgba(20,20,24,0.75)\",\r\n border: \"1px solid rgba(255,255,255,0.08)\",\r\n borderRadius: \"10px\",\r\n boxShadow: \"0 10px 40px rgba(0,0,0,0.6)\",\r\n }}\r\n >\r\n <Stack gap=\"sm\">\r\n <Title order={2} c=\"red.5\">\r\n Dirk UI Crash\r\n </Title>\r\n\r\n <Text c=\"dimmed\" size=\"sm\">\r\n The interface encountered a fatal error and stopped rendering.\r\n </Text>\r\n\r\n <Code block style={{ maxHeight: 150, overflow: \"auto\" }}>\r\n {this.state.error?.message}\r\n </Code>\r\n\r\n {/* Optional: show component stack if you pass it from props */}\r\n <Text size=\"xs\" c=\"dimmed\">\r\n Check console for full stack trace\r\n </Text>\r\n </Stack>\r\n </Box>\r\n </Box>\r\n );\r\n }\r\n}","\"use client\";\r\n\r\nimport \"@mantine/core/styles.css\";\r\nimport \"@mantine/notifications/styles.css\";\r\nimport './styles/fonts.css';\r\nimport './styles/notify.css';\r\nimport './styles/scrollBar.css';\r\nimport './styles/tornEdge.css';\r\n\r\n\r\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { fab } from \"@fortawesome/free-brands-svg-icons\";\r\nimport { far } from \"@fortawesome/free-regular-svg-icons\";\r\nimport { fas } from \"@fortawesome/free-solid-svg-icons\";\r\nlibrary.add(fas, far, fab);\r\n\r\nimport theme from \"@/theme\";\r\nimport { BackgroundImage, MantineColorShade, MantineProvider } from \"@mantine/core\";\r\nimport { useEffect, useLayoutEffect, useMemo } from \"react\";\r\n\r\nimport { fetchNui, isEnvBrowser } from \"@/utils\";\r\nimport { mergeMantineThemeSafe } from \"@/utils/mergeMantineTheme\";\r\nimport { SettingsState, useSettings } from \"@/utils/useSettings\";\r\nimport { DirkErrorBoundary } from \"./DirkErrorBoundary\";\r\n\r\nexport type DirkProviderProps = {\r\n children: React.ReactNode;\r\n overideResourceName?: string;\r\n themeOverride?: any;\r\n};\r\n\r\nexport function DirkProvider({ children, overideResourceName, themeOverride }: DirkProviderProps) {\r\n const {\r\n primaryColor,\r\n primaryShade,\r\n customTheme,\r\n game,\r\n } = useSettings();\r\n\r\n useLayoutEffect(() => {\r\n useSettings.setState({\r\n overideResourceName,\r\n });\r\n }, [overideResourceName]);\r\n\r\n useEffect(() => {\r\n fetchNui('NUI_READY').catch(() => {});\r\n fetchNui<Partial<SettingsState>>('GET_SETTINGS').then((data) => {\r\n useSettings.setState({\r\n ...data,\r\n });\r\n }).catch((err) => {\r\n console.error(\"Failed to fetch initial settings within dirk-cfx-react:\", err);\r\n });\r\n }, []);\r\n\r\n // 🚫 do not render until state is stable\r\n\r\n const mergedTheme = useMemo(\r\n () =>\r\n mergeMantineThemeSafe(\r\n { ...theme, primaryColor, primaryShade: primaryShade as MantineColorShade },\r\n customTheme,\r\n themeOverride\r\n ),\r\n [primaryColor, primaryShade, customTheme, themeOverride]\r\n );\r\n\r\n useEffect(() => {\r\n document.body.style.fontFamily =\r\n game === \"rdr3\"\r\n ? '\"Red Dead\", sans-serif'\r\n : '\"Akrobat Regular\", sans-serif';\r\n }, [game]);\r\n\r\n const content = isEnvBrowser() ? (\r\n <BackgroundImage\r\n w=\"100vw\"\r\n h=\"100vh\"\r\n src={game === \"fivem\"\r\n ? \"https://i.ytimg.com/vi/TOxuNbXrO28/maxresdefault.jpg\"\r\n : \"https://raw.githubusercontent.com/Jump-On-Studios/RedM-jo_libs/refs/heads/main/source-repositories/Menu/public/assets/images/background_dev.jpg\"}\r\n >\r\n {children}\r\n </BackgroundImage>\r\n ) : (\r\n children\r\n );\r\n\r\n return (\r\n <MantineProvider theme={mergedTheme} defaultColorScheme=\"dark\">\r\n <DirkErrorBoundary>\r\n {content}\r\n </DirkErrorBoundary>\r\n </MantineProvider>\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/theme.ts","../../src/utils/misc.ts","../../src/utils/useSettings.ts","../../src/utils/fetchNui.ts","../../src/utils/mergeMantineTheme.ts","../../src/hooks/useScriptSettings.ts","../../src/hooks/useNuiEvent.ts","../../src/providers/DirkErrorBoundary.tsx","../../src/providers/DirkProvider.tsx"],"names":["createTheme","theme","create","useRef","useEffect","React","error","jsx","Box","jsxs","Stack","Title","Text","Code","library","fas","far","fab","useLayoutEffect","useMemo","BackgroundImage","MantineProvider"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ColorInput, createTheme, MantineTheme, MultiSelect, NumberInput, TextInput } from \"@mantine/core\";\r\n\r\nexport const label = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n fontFamily: 'Akrobat Bold',\r\n letterSpacing: '0.05em',\r\n textTransform: 'uppercase', \r\n};\r\nexport const error = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n fontFamily: 'Akrobat Regular',\r\n};\r\nexport const description = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n};\r\n\r\nexport const genericInputStyles = {\r\n styles: {\r\n label: label,\r\n error: error,\r\n description: description,\r\n \r\n input:{\r\n backgroundColor: 'rgba(76, 76, 76, 0.3)', \r\n minHeight: '4vh',\r\n },\r\n },\r\n};\r\n\r\nconst theme = createTheme({\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n defaultRadius: \"xs\",\r\n fontFamily: \"Akrobat Regular, sans-serif\",\r\n\r\n radius:{\r\n xxs: '0.3vh',\r\n xs: '0.5vh',\r\n sm: '0.75vh',\r\n md: '1vh',\r\n lg: '1.5vh',\r\n xl: '2vh',\r\n xxl: '3vh',\r\n },\r\n\r\n fontSizes: {\r\n xxs: '1.2vh',\r\n xs: '1.5vh',\r\n sm: '1.8vh',\r\n md: '2.2vh',\r\n lg: '2.8vh',\r\n xl: '3.3vh',\r\n xxl: '3.8vh',\r\n },\r\n\r\n lineHeights: {\r\n xxs: '1.4vh',\r\n xs: '1.8vh',\r\n sm: '2.2vh',\r\n md: '2.8vh',\r\n lg: '3.3vh',\r\n xl: '3.8vh',\r\n },\r\n\r\n spacing:{\r\n xxs: '0.5vh',\r\n xs: '0.75vh',\r\n sm: '1.5vh',\r\n md: '2vh',\r\n lg: '3vh',\r\n xl: '4vh',\r\n xxl: '5vh',\r\n },\r\n\r\n components:{\r\n Progress:{\r\n styles:{\r\n label: {\r\n fontFamily: 'Akrobat Bold',\r\n letterSpacing: '0.05em',\r\n textTransform: 'uppercase', \r\n },\r\n\r\n root:{\r\n backgroundColor: 'rgba(77, 77, 77, 0.4)',\r\n },\r\n \r\n }\r\n },\r\n \r\n \r\n Input: genericInputStyles,\r\n TextInput: genericInputStyles,\r\n NumberInput: genericInputStyles,\r\n Select: genericInputStyles,\r\n MultiSelect: genericInputStyles, \r\n Textarea: genericInputStyles,\r\n ColorInput: genericInputStyles,\r\n DateInput: genericInputStyles,\r\n\r\n Pill: {\r\n styles: (theme: MantineTheme) => ({\r\n root: {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: 'rgba(76, 76, 76, 0.3)',\r\n height: 'fit-content',\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.05em',\r\n fontFamily: 'Akrobat Bold',\r\n fontSize: '1.25vh',\r\n borderRadius: theme.defaultRadius,\r\n paddingBottom: '0.5vh',\r\n paddingTop: '0.5vh',\r\n }\r\n })\r\n },\r\n\r\n },\r\n\r\n colors: {\r\n\r\n dirk:[\r\n \"#ffffff\",\r\n \"#f3fce9\",\r\n \"#dbf5bd\",\r\n \"#c3ee91\",\r\n \"#ace765\",\r\n \"#94e039\",\r\n \"#7ac61f\",\r\n \"#5f9a18\",\r\n \"#29420a\",\r\n \"#446e11\",\r\n ],\r\n },\r\n});\r\n\r\n\r\nexport default theme;","export const isEnvBrowser = (): boolean => !(window as any).invokeNative;\r\n\r\n// Basic no operation function\r\nexport const noop = () => {};\r\n\r\nexport const splitFAString = (faString:string) => {\r\n const [prefix, newIcon] = faString.split('-');\r\n if (!prefix || !newIcon) return {prefix: 'fas', newIcon: 'question'};\r\n return {prefix, newIcon};\r\n}\r\n\r\nexport const numberToRoman = (num:number) => {\r\n const romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX'] \r\n return romanNumerals[num]\r\n}\r\n\r\nexport const copyToClipboard = (text:string) => {\r\n const el = document.createElement('textarea');\r\n el.value = text;\r\n document.body.appendChild(el);\r\n el.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(el);\r\n}\r\n\r\nexport const openLink = (url:string) => {\r\n if (isEnvBrowser()) {\r\n window.open(url, '_blank');\r\n } else {\r\n // @ts-expect-error -- invokeNative exists in NUI\r\n window.invokeNative('openLink', url);\r\n } \r\n}","import { MantineColorsTuple } from \"@mantine/core\";\r\nimport { create } from \"zustand\";\r\n\r\nexport type SettingsState = {\r\n game: \"fivem\" | \"rdr3\";\r\n currency: string;\r\n primaryColor: string;\r\n primaryShade: number;\r\n itemImgPath: string;\r\n customTheme?: MantineColorsTuple;\r\n overideResourceName?: string;\r\n};\r\n\r\nexport const useSettings = create<SettingsState>(() => ({\r\n currency: \"$\",\r\n game: \"fivem\",\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n itemImgPath: \"\",\r\n customTheme: [\r\n \"#f0f4ff\",\r\n \"#d9e3ff\",\r\n \"#bfcfff\",\r\n \"#a6bbff\",\r\n \"#8ca7ff\",\r\n \"#7393ff\",\r\n \"#5a7fff\",\r\n \"#406bff\",\r\n \"#2547ff\",\r\n \"#0b33ff\",\r\n ],\r\n}));\r\n\r\n// registerInitialFetch<Partial<SettingsState>>('GET_SETTINGS', undefined).then((data) => {\r\n// if (!data) {\r\n// console.warn('No settings data received from GET_SETTINGS fetch.');\r\n// return;\r\n// }\r\n// useSettings.setState({\r\n// ...data,\r\n// });\r\n// })\r\n","import { useEffect } from \"react\";\r\nimport { isEnvBrowser } from \"./misc\";\r\nimport { useSettings } from \"./useSettings\";\r\n\r\n/**\r\n * Simple wrapper around fetch API tailored for CEF/NUI use.\r\n */\r\nexport async function fetchNui<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T,\r\n): Promise<T> {\r\n const options = {\r\n method: \"post\",\r\n headers: {\r\n \"Content-Type\": \"application/json; charset=UTF-8\",\r\n },\r\n body: JSON.stringify(data),\r\n };\r\n\r\n if (isEnvBrowser() && mockData !== undefined) return mockData;\r\n if (isEnvBrowser() && mockData === undefined) {\r\n console.warn(\r\n `[fetchNui] Called fetchNui for event \"${eventName}\" in browser environment without mockData. Returning empty object.`,\r\n );\r\n return {} as T;\r\n }\r\n\r\n const overrideResourceName = useSettings.getState().overideResourceName;\r\n\r\n const resourceName = (window as any).GetParentResourceName\r\n ? (window as any).GetParentResourceName()\r\n : overrideResourceName ? overrideResourceName : \"dirk-cfx-react\";\r\n const resp = await fetch(`https://${resourceName}/${eventName}`, options);\r\n return await resp.json();\r\n}\r\n\r\n// -----------------------------\r\n// Initial fetch registration\r\n// -----------------------------\r\nexport type InitialFetch<T> = () => Promise<T>;\r\nexport const initialFetches: Record<string, InitialFetch<unknown>> = {};\r\n\r\n/**\r\n * Registers an initial fetch that automatically uses fetchNui.\r\n * Works like:\r\n * ```ts\r\n * registerInitialFetch<{ name: string }>(\"MY_EVENT_NAME\", undefined, { name: \"Mocky\" });\r\n * ```\r\n * and returns a Promise resolving to the same type as fetchNui.\r\n */\r\nexport async function registerInitialFetch<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T,\r\n): Promise<T> {\r\n const fetcher = () => fetchNui<T>(eventName, data, mockData);\r\n initialFetches[eventName] = fetcher;\r\n return fetcher(); // run immediately if needed\r\n}\r\n\r\n/**\r\n * Runs all registered initial fetches in parallel.\r\n */\r\nexport async function runFetches() {\r\n return Promise.all(\r\n Object.entries(initialFetches).map(async ([eventName, fetcher]) => {\r\n const data = await fetcher();\r\n return { eventName, data };\r\n }),\r\n );\r\n}\r\n\r\n/**\r\n * React hook to automatically run all registered fetches on mount.\r\n */\r\nexport const useAutoFetcher = () => {\r\n useEffect(() => {\r\n if (isEnvBrowser()) return;\r\n const run = async () => {\r\n const results = await runFetches();\r\n };\r\n run();\r\n }, []);\r\n};\r\n\r\n\r\nexport const fetchLuaTable = <T>(tableName: string, mockData?: T): Promise<T> => { \r\n return fetchNui<T>('FETCH_LUA_TABLE', { tableName }, mockData);\r\n} \r\n\r\nexport const registerInitialLuaTableFetch = <T>(tableName: string, mockData?: T): Promise<T> => { \r\n return registerInitialFetch<T>('FETCH_LUA_TABLE', { tableName }, mockData);\r\n} \r\n\r\n\r\n\r\n// useage example:\r\n// registerInitialLuaTableFetch<{ [key: string]: string }>('my_lua_table', { key1: 'value1', key2: 'value2' }); \r\n","import type { MantineColorsTuple, MantineThemeOverride } from \"@mantine/core\";\r\n\r\nconst isValidColorScale = (v: unknown): v is MantineColorsTuple =>\r\n Array.isArray(v) && v.length === 10 && v.every((shade) => typeof shade === \"string\");\r\n\r\nexport function mergeMantineThemeSafe(\r\n base: MantineThemeOverride,\r\n custom?: MantineColorsTuple,\r\n override?: MantineThemeOverride\r\n): MantineThemeOverride {\r\n const colors = { ...base.colors };\r\n\r\n if (custom && isValidColorScale(custom)) {\r\n colors[\"custom\"] = custom;\r\n } \r\n\r\n return {\r\n ...base,\r\n ...override,\r\n colors: {\r\n ...colors,\r\n ...(override?.colors ?? {}),\r\n },\r\n };\r\n}\r\n","\r\n\r\n// This is a function that you will call and it will return liek so \r\n// const {useScriptSettings, useScriptSettingHooks} = createScriptSettings<YourTypeHere>({\r\n// key1: 'your_unique_value1',\r\n// key2: {}\r\n// subKey1: 'your_unique_value2',\r\n// subKey2: 'your_unique_value3'\r\n// }\r\n// })\r\n\r\nimport { fetchNui } from \"@/utils\";\r\nimport { create } from \"zustand\";\r\ntype NuiResponse = { success: boolean; message: string };\r\n\r\n// Global registry — DirkProvider dispatches here so apps need zero setup boilerplate\r\nconst _scriptSettingsUpdaters: ((data: unknown) => void)[] = [];\r\n\r\nexport function _dispatchScriptSettingsUpdate(data: unknown) {\r\n _scriptSettingsUpdaters.forEach(fn => fn(data));\r\n}\r\n\r\nexport function createScriptSettings<T>(defaultValue: T) {\r\n const store = create<T>(() => defaultValue);\r\n\r\n // Register this store's updater into the global registry\r\n _scriptSettingsUpdaters.push((data: unknown) => {\r\n store.setState((prev) => ({ ...prev, ...(data as Partial<T>) }));\r\n });\r\n\r\n // kept for backward compatibility — no longer needs to be called\r\n const useScriptSettingHooks = () => {};\r\n\r\n const updateScriptSettings = async (newSettings: Partial<T>): Promise<NuiResponse> => {\r\n store.setState((prev) => ({ ...prev, ...newSettings }));\r\n return await fetchNui<NuiResponse>(\"UPDATE_SCRIPT_SETTINGS\", newSettings);\r\n };\r\n\r\n return {store, updateScriptSettings, useScriptSettingHooks}\r\n} \r\n\r\n\r\n","import { MutableRefObject, useEffect, useRef } from \"react\";\r\nimport { noop } from \"../utils/misc\";\r\n\r\nexport interface NuiMessageData<T = unknown> {\r\n action: string;\r\n data: T;\r\n}\r\n\r\nexport type NuiHandlerSignature<T> = ( data: T) => void;\r\n\r\n/**\r\n * A hook that manage events listeners for receiving data from the client scripts\r\n * @param action The specific `action` that should be listened for.\r\n * @param handler The callback function that will handle data relayed by this hook\r\n *\r\n * @example\r\n * useNuiEvent<{visibility: true, wasVisible: 'something'}>('setVisible', (data) => {\r\n * // whatever logic you want\r\n * })\r\n *\r\n **/\r\n\r\nexport const useNuiEvent = <T = unknown>(\r\n action: string,\r\n handler: ( data: T) => void,\r\n) => {\r\n const savedHandler: MutableRefObject<NuiHandlerSignature<T>> = useRef(noop);\r\n\r\n // Make sure we handle for a reactive handler\r\n useEffect(() => {\r\n savedHandler.current = handler;\r\n }, [handler]);\r\n\r\n useEffect(() => {\r\n const eventListener = (event: MessageEvent<NuiMessageData<T>>) => {\r\n const { action: eventAction, data } = event.data;\r\n\r\n if (savedHandler.current) {\r\n if (eventAction === action) {\r\n savedHandler.current( data);\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener(\"message\", eventListener);\r\n // Remove Event Listener on component dirkup\r\n return () => window.removeEventListener(\"message\", eventListener);\r\n }, [action]);\r\n};\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { Box, Code, Stack, Text, Title } from \"@mantine/core\";\r\n\r\ntype State = {\r\n error: Error | null;\r\n stack?: string;\r\n};\r\n\r\nexport class DirkErrorBoundary extends React.Component<\r\n { children: React.ReactNode },\r\n State\r\n> {\r\n state: State = { error: null, stack: undefined };\r\n\r\n static getDerivedStateFromError(error: Error) {\r\n // We can't get component stack here, so just store the error\r\n return { error };\r\n }\r\n\r\n componentDidCatch(error: Error, info: React.ErrorInfo) {\r\n console.group(\"🔥 Dirk UI Crash\");\r\n console.error(\"Error:\", error);\r\n console.error(\"Component Stack:\", info.componentStack);\r\n console.groupEnd();\r\n\r\n // Only log here, don't call setState — the error state is already captured\r\n }\r\n\r\n render() {\r\n if (!this.state.error) return this.props.children;\r\n\r\n return (\r\n <Box\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n width: \"100vw\",\r\n height: \"100vh\",\r\n background: \"rgba(10, 10, 12, 0.92)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"2rem\",\r\n zIndex: 999999,\r\n }}\r\n >\r\n <Box\r\n maw={900}\r\n w=\"100%\"\r\n p=\"lg\"\r\n style={{\r\n background: \"rgba(20,20,24,0.75)\",\r\n border: \"1px solid rgba(255,255,255,0.08)\",\r\n borderRadius: \"10px\",\r\n boxShadow: \"0 10px 40px rgba(0,0,0,0.6)\",\r\n }}\r\n >\r\n <Stack gap=\"sm\">\r\n <Title order={2} c=\"red.5\">\r\n Dirk UI Crash\r\n </Title>\r\n\r\n <Text c=\"dimmed\" size=\"sm\">\r\n The interface encountered a fatal error and stopped rendering.\r\n </Text>\r\n\r\n <Code block style={{ maxHeight: 150, overflow: \"auto\" }}>\r\n {this.state.error?.message}\r\n </Code>\r\n\r\n {/* Optional: show component stack if you pass it from props */}\r\n <Text size=\"xs\" c=\"dimmed\">\r\n Check console for full stack trace\r\n </Text>\r\n </Stack>\r\n </Box>\r\n </Box>\r\n );\r\n }\r\n}","\"use client\";\r\n\r\nimport \"@mantine/core/styles.css\";\r\nimport \"@mantine/notifications/styles.css\";\r\nimport './styles/fonts.css';\r\nimport './styles/notify.css';\r\nimport './styles/scrollBar.css';\r\nimport './styles/tornEdge.css';\r\n\r\n\r\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { fab } from \"@fortawesome/free-brands-svg-icons\";\r\nimport { far } from \"@fortawesome/free-regular-svg-icons\";\r\nimport { fas } from \"@fortawesome/free-solid-svg-icons\";\r\nlibrary.add(fas, far, fab);\r\n\r\nimport theme from \"@/theme\";\r\nimport { BackgroundImage, MantineColorShade, MantineProvider } from \"@mantine/core\";\r\nimport { useEffect, useLayoutEffect, useMemo } from \"react\";\r\n\r\nimport { fetchNui, isEnvBrowser } from \"@/utils\";\r\nimport { mergeMantineThemeSafe } from \"@/utils/mergeMantineTheme\";\r\nimport { SettingsState, useSettings } from \"@/utils/useSettings\";\r\nimport { _dispatchScriptSettingsUpdate } from \"@/hooks/useScriptSettings\";\r\nimport { useNuiEvent } from \"@/hooks\";\r\nimport { DirkErrorBoundary } from \"./DirkErrorBoundary\";\r\n\r\nexport type DirkProviderProps = {\r\n children: React.ReactNode;\r\n overideResourceName?: string;\r\n themeOverride?: any;\r\n};\r\n\r\nexport function DirkProvider({ children, overideResourceName, themeOverride }: DirkProviderProps) {\r\n const {\r\n primaryColor,\r\n primaryShade,\r\n customTheme,\r\n game,\r\n } = useSettings();\r\n\r\n useLayoutEffect(() => {\r\n useSettings.setState({\r\n overideResourceName,\r\n });\r\n }, [overideResourceName]);\r\n\r\n useEffect(() => {\r\n fetchNui('NUI_READY').catch(() => {});\r\n fetchNui<Partial<SettingsState>>('GET_SETTINGS').then((data) => {\r\n useSettings.setState({\r\n ...data,\r\n });\r\n }).catch((err) => {\r\n console.error(\"Failed to fetch initial settings within dirk-cfx-react:\", err);\r\n });\r\n }, []);\r\n\r\n useNuiEvent<unknown>('UPDATE_SCRIPT_SETTINGS', _dispatchScriptSettingsUpdate);\r\n\r\n // 🚫 do not render until state is stable\r\n\r\n const mergedTheme = useMemo(\r\n () =>\r\n mergeMantineThemeSafe(\r\n { ...theme, primaryColor, primaryShade: primaryShade as MantineColorShade },\r\n customTheme,\r\n themeOverride\r\n ),\r\n [primaryColor, primaryShade, customTheme, themeOverride]\r\n );\r\n\r\n useEffect(() => {\r\n document.body.style.fontFamily =\r\n game === \"rdr3\"\r\n ? '\"Red Dead\", sans-serif'\r\n : '\"Akrobat Regular\", sans-serif';\r\n }, [game]);\r\n\r\n const content = isEnvBrowser() ? (\r\n <BackgroundImage\r\n w=\"100vw\"\r\n h=\"100vh\"\r\n src={game === \"fivem\"\r\n ? \"https://i.ytimg.com/vi/TOxuNbXrO28/maxresdefault.jpg\"\r\n : \"https://raw.githubusercontent.com/Jump-On-Studios/RedM-jo_libs/refs/heads/main/source-repositories/Menu/public/assets/images/background_dev.jpg\"}\r\n >\r\n {children}\r\n </BackgroundImage>\r\n ) : (\r\n children\r\n );\r\n\r\n return (\r\n <MantineProvider theme={mergedTheme} defaultColorScheme=\"dark\">\r\n <DirkErrorBoundary>\r\n {content}\r\n </DirkErrorBoundary>\r\n </MantineProvider>\r\n );\r\n}\r\n"]}
|
package/dist/providers/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import { fab } from '@fortawesome/free-brands-svg-icons';
|
|
|
9
9
|
import { far } from '@fortawesome/free-regular-svg-icons';
|
|
10
10
|
import { fas } from '@fortawesome/free-solid-svg-icons';
|
|
11
11
|
import { createTheme, Box, Stack, Title, Text, Code, MantineProvider, BackgroundImage } from '@mantine/core';
|
|
12
|
-
import React, { useLayoutEffect, useEffect, useMemo } from 'react';
|
|
12
|
+
import React, { useLayoutEffect, useEffect, useMemo, useRef } from 'react';
|
|
13
13
|
import { create } from 'zustand';
|
|
14
14
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
15
15
|
|
|
@@ -139,6 +139,8 @@ var theme_default = theme;
|
|
|
139
139
|
|
|
140
140
|
// src/utils/misc.ts
|
|
141
141
|
var isEnvBrowser = () => !window.invokeNative;
|
|
142
|
+
var noop = () => {
|
|
143
|
+
};
|
|
142
144
|
var useSettings = create(() => ({
|
|
143
145
|
currency: "$",
|
|
144
146
|
game: "fivem",
|
|
@@ -196,6 +198,28 @@ function mergeMantineThemeSafe(base, custom, override) {
|
|
|
196
198
|
}
|
|
197
199
|
};
|
|
198
200
|
}
|
|
201
|
+
var _scriptSettingsUpdaters = [];
|
|
202
|
+
function _dispatchScriptSettingsUpdate(data) {
|
|
203
|
+
_scriptSettingsUpdaters.forEach((fn) => fn(data));
|
|
204
|
+
}
|
|
205
|
+
var useNuiEvent = (action, handler) => {
|
|
206
|
+
const savedHandler = useRef(noop);
|
|
207
|
+
useEffect(() => {
|
|
208
|
+
savedHandler.current = handler;
|
|
209
|
+
}, [handler]);
|
|
210
|
+
useEffect(() => {
|
|
211
|
+
const eventListener = (event) => {
|
|
212
|
+
const { action: eventAction, data } = event.data;
|
|
213
|
+
if (savedHandler.current) {
|
|
214
|
+
if (eventAction === action) {
|
|
215
|
+
savedHandler.current(data);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
window.addEventListener("message", eventListener);
|
|
220
|
+
return () => window.removeEventListener("message", eventListener);
|
|
221
|
+
}, [action]);
|
|
222
|
+
};
|
|
199
223
|
var DirkErrorBoundary = class extends React.Component {
|
|
200
224
|
constructor() {
|
|
201
225
|
super(...arguments);
|
|
@@ -275,6 +299,7 @@ function DirkProvider({ children, overideResourceName, themeOverride }) {
|
|
|
275
299
|
console.error("Failed to fetch initial settings within dirk-cfx-react:", err);
|
|
276
300
|
});
|
|
277
301
|
}, []);
|
|
302
|
+
useNuiEvent("UPDATE_SCRIPT_SETTINGS", _dispatchScriptSettingsUpdate);
|
|
278
303
|
const mergedTheme = useMemo(
|
|
279
304
|
() => mergeMantineThemeSafe(
|
|
280
305
|
{ ...theme_default, primaryColor, primaryShade },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/theme.ts","../../src/utils/misc.ts","../../src/utils/useSettings.ts","../../src/utils/fetchNui.ts","../../src/utils/mergeMantineTheme.ts","../../src/providers/DirkErrorBoundary.tsx","../../src/providers/DirkProvider.tsx"],"names":["theme","error","useEffect","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { ColorInput, createTheme, MantineTheme, MultiSelect, NumberInput, TextInput } from \"@mantine/core\";\r\n\r\nexport const label = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n fontFamily: 'Akrobat Bold',\r\n letterSpacing: '0.05em',\r\n textTransform: 'uppercase', \r\n};\r\nexport const error = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n fontFamily: 'Akrobat Regular',\r\n};\r\nexport const description = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n};\r\n\r\nexport const genericInputStyles = {\r\n styles: {\r\n label: label,\r\n error: error,\r\n description: description,\r\n \r\n input:{\r\n backgroundColor: 'rgba(76, 76, 76, 0.3)', \r\n minHeight: '4vh',\r\n },\r\n },\r\n};\r\n\r\nconst theme = createTheme({\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n defaultRadius: \"xs\",\r\n fontFamily: \"Akrobat Regular, sans-serif\",\r\n\r\n radius:{\r\n xxs: '0.3vh',\r\n xs: '0.5vh',\r\n sm: '0.75vh',\r\n md: '1vh',\r\n lg: '1.5vh',\r\n xl: '2vh',\r\n xxl: '3vh',\r\n },\r\n\r\n fontSizes: {\r\n xxs: '1.2vh',\r\n xs: '1.5vh',\r\n sm: '1.8vh',\r\n md: '2.2vh',\r\n lg: '2.8vh',\r\n xl: '3.3vh',\r\n xxl: '3.8vh',\r\n },\r\n\r\n lineHeights: {\r\n xxs: '1.4vh',\r\n xs: '1.8vh',\r\n sm: '2.2vh',\r\n md: '2.8vh',\r\n lg: '3.3vh',\r\n xl: '3.8vh',\r\n },\r\n\r\n spacing:{\r\n xxs: '0.5vh',\r\n xs: '0.75vh',\r\n sm: '1.5vh',\r\n md: '2vh',\r\n lg: '3vh',\r\n xl: '4vh',\r\n xxl: '5vh',\r\n },\r\n\r\n components:{\r\n Progress:{\r\n styles:{\r\n label: {\r\n fontFamily: 'Akrobat Bold',\r\n letterSpacing: '0.05em',\r\n textTransform: 'uppercase', \r\n },\r\n\r\n root:{\r\n backgroundColor: 'rgba(77, 77, 77, 0.4)',\r\n },\r\n \r\n }\r\n },\r\n \r\n \r\n Input: genericInputStyles,\r\n TextInput: genericInputStyles,\r\n NumberInput: genericInputStyles,\r\n Select: genericInputStyles,\r\n MultiSelect: genericInputStyles, \r\n Textarea: genericInputStyles,\r\n ColorInput: genericInputStyles,\r\n DateInput: genericInputStyles,\r\n\r\n Pill: {\r\n styles: (theme: MantineTheme) => ({\r\n root: {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: 'rgba(76, 76, 76, 0.3)',\r\n height: 'fit-content',\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.05em',\r\n fontFamily: 'Akrobat Bold',\r\n fontSize: '1.25vh',\r\n borderRadius: theme.defaultRadius,\r\n paddingBottom: '0.5vh',\r\n paddingTop: '0.5vh',\r\n }\r\n })\r\n },\r\n\r\n },\r\n\r\n colors: {\r\n\r\n dirk:[\r\n \"#ffffff\",\r\n \"#f3fce9\",\r\n \"#dbf5bd\",\r\n \"#c3ee91\",\r\n \"#ace765\",\r\n \"#94e039\",\r\n \"#7ac61f\",\r\n \"#5f9a18\",\r\n \"#29420a\",\r\n \"#446e11\",\r\n ],\r\n },\r\n});\r\n\r\n\r\nexport default theme;","export const isEnvBrowser = (): boolean => !(window as any).invokeNative;\r\n\r\n// Basic no operation function\r\nexport const noop = () => {};\r\n\r\nexport const splitFAString = (faString:string) => {\r\n const [prefix, newIcon] = faString.split('-');\r\n if (!prefix || !newIcon) return {prefix: 'fas', newIcon: 'question'};\r\n return {prefix, newIcon};\r\n}\r\n\r\nexport const numberToRoman = (num:number) => {\r\n const romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX'] \r\n return romanNumerals[num]\r\n}\r\n\r\nexport const copyToClipboard = (text:string) => {\r\n const el = document.createElement('textarea');\r\n el.value = text;\r\n document.body.appendChild(el);\r\n el.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(el);\r\n}\r\n\r\nexport const openLink = (url:string) => {\r\n if (isEnvBrowser()) {\r\n window.open(url, '_blank');\r\n } else {\r\n // @ts-expect-error -- invokeNative exists in NUI\r\n window.invokeNative('openLink', url);\r\n } \r\n}","import { MantineColorsTuple } from \"@mantine/core\";\r\nimport { create } from \"zustand\";\r\n\r\nexport type SettingsState = {\r\n game: \"fivem\" | \"rdr3\";\r\n currency: string;\r\n primaryColor: string;\r\n primaryShade: number;\r\n itemImgPath: string;\r\n customTheme?: MantineColorsTuple;\r\n overideResourceName?: string;\r\n};\r\n\r\nexport const useSettings = create<SettingsState>(() => ({\r\n currency: \"$\",\r\n game: \"fivem\",\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n itemImgPath: \"\",\r\n customTheme: [\r\n \"#f0f4ff\",\r\n \"#d9e3ff\",\r\n \"#bfcfff\",\r\n \"#a6bbff\",\r\n \"#8ca7ff\",\r\n \"#7393ff\",\r\n \"#5a7fff\",\r\n \"#406bff\",\r\n \"#2547ff\",\r\n \"#0b33ff\",\r\n ],\r\n}));\r\n\r\n// registerInitialFetch<Partial<SettingsState>>('GET_SETTINGS', undefined).then((data) => {\r\n// if (!data) {\r\n// console.warn('No settings data received from GET_SETTINGS fetch.');\r\n// return;\r\n// }\r\n// useSettings.setState({\r\n// ...data,\r\n// });\r\n// })\r\n","import { useEffect } from \"react\";\r\nimport { isEnvBrowser } from \"./misc\";\r\nimport { useSettings } from \"./useSettings\";\r\n\r\n/**\r\n * Simple wrapper around fetch API tailored for CEF/NUI use.\r\n */\r\nexport async function fetchNui<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T,\r\n): Promise<T> {\r\n const options = {\r\n method: \"post\",\r\n headers: {\r\n \"Content-Type\": \"application/json; charset=UTF-8\",\r\n },\r\n body: JSON.stringify(data),\r\n };\r\n\r\n if (isEnvBrowser() && mockData !== undefined) return mockData;\r\n if (isEnvBrowser() && mockData === undefined) {\r\n console.warn(\r\n `[fetchNui] Called fetchNui for event \"${eventName}\" in browser environment without mockData. Returning empty object.`,\r\n );\r\n return {} as T;\r\n }\r\n\r\n const overrideResourceName = useSettings.getState().overideResourceName;\r\n\r\n const resourceName = (window as any).GetParentResourceName\r\n ? (window as any).GetParentResourceName()\r\n : overrideResourceName ? overrideResourceName : \"dirk-cfx-react\";\r\n const resp = await fetch(`https://${resourceName}/${eventName}`, options);\r\n return await resp.json();\r\n}\r\n\r\n// -----------------------------\r\n// Initial fetch registration\r\n// -----------------------------\r\nexport type InitialFetch<T> = () => Promise<T>;\r\nexport const initialFetches: Record<string, InitialFetch<unknown>> = {};\r\n\r\n/**\r\n * Registers an initial fetch that automatically uses fetchNui.\r\n * Works like:\r\n * ```ts\r\n * registerInitialFetch<{ name: string }>(\"MY_EVENT_NAME\", undefined, { name: \"Mocky\" });\r\n * ```\r\n * and returns a Promise resolving to the same type as fetchNui.\r\n */\r\nexport async function registerInitialFetch<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T,\r\n): Promise<T> {\r\n const fetcher = () => fetchNui<T>(eventName, data, mockData);\r\n initialFetches[eventName] = fetcher;\r\n return fetcher(); // run immediately if needed\r\n}\r\n\r\n/**\r\n * Runs all registered initial fetches in parallel.\r\n */\r\nexport async function runFetches() {\r\n return Promise.all(\r\n Object.entries(initialFetches).map(async ([eventName, fetcher]) => {\r\n const data = await fetcher();\r\n return { eventName, data };\r\n }),\r\n );\r\n}\r\n\r\n/**\r\n * React hook to automatically run all registered fetches on mount.\r\n */\r\nexport const useAutoFetcher = () => {\r\n useEffect(() => {\r\n if (isEnvBrowser()) return;\r\n const run = async () => {\r\n const results = await runFetches();\r\n };\r\n run();\r\n }, []);\r\n};\r\n\r\n\r\nexport const fetchLuaTable = <T>(tableName: string, mockData?: T): Promise<T> => { \r\n return fetchNui<T>('FETCH_LUA_TABLE', { tableName }, mockData);\r\n} \r\n\r\nexport const registerInitialLuaTableFetch = <T>(tableName: string, mockData?: T): Promise<T> => { \r\n return registerInitialFetch<T>('FETCH_LUA_TABLE', { tableName }, mockData);\r\n} \r\n\r\n\r\n\r\n// useage example:\r\n// registerInitialLuaTableFetch<{ [key: string]: string }>('my_lua_table', { key1: 'value1', key2: 'value2' }); \r\n","import type { MantineColorsTuple, MantineThemeOverride } from \"@mantine/core\";\r\n\r\nconst isValidColorScale = (v: unknown): v is MantineColorsTuple =>\r\n Array.isArray(v) && v.length === 10 && v.every((shade) => typeof shade === \"string\");\r\n\r\nexport function mergeMantineThemeSafe(\r\n base: MantineThemeOverride,\r\n custom?: MantineColorsTuple,\r\n override?: MantineThemeOverride\r\n): MantineThemeOverride {\r\n const colors = { ...base.colors };\r\n\r\n if (custom && isValidColorScale(custom)) {\r\n colors[\"custom\"] = custom;\r\n } \r\n\r\n return {\r\n ...base,\r\n ...override,\r\n colors: {\r\n ...colors,\r\n ...(override?.colors ?? {}),\r\n },\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { Box, Code, Stack, Text, Title } from \"@mantine/core\";\r\n\r\ntype State = {\r\n error: Error | null;\r\n stack?: string;\r\n};\r\n\r\nexport class DirkErrorBoundary extends React.Component<\r\n { children: React.ReactNode },\r\n State\r\n> {\r\n state: State = { error: null, stack: undefined };\r\n\r\n static getDerivedStateFromError(error: Error) {\r\n // We can't get component stack here, so just store the error\r\n return { error };\r\n }\r\n\r\n componentDidCatch(error: Error, info: React.ErrorInfo) {\r\n console.group(\"🔥 Dirk UI Crash\");\r\n console.error(\"Error:\", error);\r\n console.error(\"Component Stack:\", info.componentStack);\r\n console.groupEnd();\r\n\r\n // Only log here, don't call setState — the error state is already captured\r\n }\r\n\r\n render() {\r\n if (!this.state.error) return this.props.children;\r\n\r\n return (\r\n <Box\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n width: \"100vw\",\r\n height: \"100vh\",\r\n background: \"rgba(10, 10, 12, 0.92)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"2rem\",\r\n zIndex: 999999,\r\n }}\r\n >\r\n <Box\r\n maw={900}\r\n w=\"100%\"\r\n p=\"lg\"\r\n style={{\r\n background: \"rgba(20,20,24,0.75)\",\r\n border: \"1px solid rgba(255,255,255,0.08)\",\r\n borderRadius: \"10px\",\r\n boxShadow: \"0 10px 40px rgba(0,0,0,0.6)\",\r\n }}\r\n >\r\n <Stack gap=\"sm\">\r\n <Title order={2} c=\"red.5\">\r\n Dirk UI Crash\r\n </Title>\r\n\r\n <Text c=\"dimmed\" size=\"sm\">\r\n The interface encountered a fatal error and stopped rendering.\r\n </Text>\r\n\r\n <Code block style={{ maxHeight: 150, overflow: \"auto\" }}>\r\n {this.state.error?.message}\r\n </Code>\r\n\r\n {/* Optional: show component stack if you pass it from props */}\r\n <Text size=\"xs\" c=\"dimmed\">\r\n Check console for full stack trace\r\n </Text>\r\n </Stack>\r\n </Box>\r\n </Box>\r\n );\r\n }\r\n}","\"use client\";\r\n\r\nimport \"@mantine/core/styles.css\";\r\nimport \"@mantine/notifications/styles.css\";\r\nimport './styles/fonts.css';\r\nimport './styles/notify.css';\r\nimport './styles/scrollBar.css';\r\nimport './styles/tornEdge.css';\r\n\r\n\r\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { fab } from \"@fortawesome/free-brands-svg-icons\";\r\nimport { far } from \"@fortawesome/free-regular-svg-icons\";\r\nimport { fas } from \"@fortawesome/free-solid-svg-icons\";\r\nlibrary.add(fas, far, fab);\r\n\r\nimport theme from \"@/theme\";\r\nimport { BackgroundImage, MantineColorShade, MantineProvider } from \"@mantine/core\";\r\nimport { useEffect, useLayoutEffect, useMemo } from \"react\";\r\n\r\nimport { fetchNui, isEnvBrowser } from \"@/utils\";\r\nimport { mergeMantineThemeSafe } from \"@/utils/mergeMantineTheme\";\r\nimport { SettingsState, useSettings } from \"@/utils/useSettings\";\r\nimport { DirkErrorBoundary } from \"./DirkErrorBoundary\";\r\n\r\nexport type DirkProviderProps = {\r\n children: React.ReactNode;\r\n overideResourceName?: string;\r\n themeOverride?: any;\r\n};\r\n\r\nexport function DirkProvider({ children, overideResourceName, themeOverride }: DirkProviderProps) {\r\n const {\r\n primaryColor,\r\n primaryShade,\r\n customTheme,\r\n game,\r\n } = useSettings();\r\n\r\n useLayoutEffect(() => {\r\n useSettings.setState({\r\n overideResourceName,\r\n });\r\n }, [overideResourceName]);\r\n\r\n useEffect(() => {\r\n fetchNui('NUI_READY').catch(() => {});\r\n fetchNui<Partial<SettingsState>>('GET_SETTINGS').then((data) => {\r\n useSettings.setState({\r\n ...data,\r\n });\r\n }).catch((err) => {\r\n console.error(\"Failed to fetch initial settings within dirk-cfx-react:\", err);\r\n });\r\n }, []);\r\n\r\n // 🚫 do not render until state is stable\r\n\r\n const mergedTheme = useMemo(\r\n () =>\r\n mergeMantineThemeSafe(\r\n { ...theme, primaryColor, primaryShade: primaryShade as MantineColorShade },\r\n customTheme,\r\n themeOverride\r\n ),\r\n [primaryColor, primaryShade, customTheme, themeOverride]\r\n );\r\n\r\n useEffect(() => {\r\n document.body.style.fontFamily =\r\n game === \"rdr3\"\r\n ? '\"Red Dead\", sans-serif'\r\n : '\"Akrobat Regular\", sans-serif';\r\n }, [game]);\r\n\r\n const content = isEnvBrowser() ? (\r\n <BackgroundImage\r\n w=\"100vw\"\r\n h=\"100vh\"\r\n src={game === \"fivem\"\r\n ? \"https://i.ytimg.com/vi/TOxuNbXrO28/maxresdefault.jpg\"\r\n : \"https://raw.githubusercontent.com/Jump-On-Studios/RedM-jo_libs/refs/heads/main/source-repositories/Menu/public/assets/images/background_dev.jpg\"}\r\n >\r\n {children}\r\n </BackgroundImage>\r\n ) : (\r\n children\r\n );\r\n\r\n return (\r\n <MantineProvider theme={mergedTheme} defaultColorScheme=\"dark\">\r\n <DirkErrorBoundary>\r\n {content}\r\n </DirkErrorBoundary>\r\n </MantineProvider>\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/theme.ts","../../src/utils/misc.ts","../../src/utils/useSettings.ts","../../src/utils/fetchNui.ts","../../src/utils/mergeMantineTheme.ts","../../src/hooks/useScriptSettings.ts","../../src/hooks/useNuiEvent.ts","../../src/providers/DirkErrorBoundary.tsx","../../src/providers/DirkProvider.tsx"],"names":["theme","useEffect","error","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { ColorInput, createTheme, MantineTheme, MultiSelect, NumberInput, TextInput } from \"@mantine/core\";\r\n\r\nexport const label = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n fontFamily: 'Akrobat Bold',\r\n letterSpacing: '0.05em',\r\n textTransform: 'uppercase', \r\n};\r\nexport const error = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n fontFamily: 'Akrobat Regular',\r\n};\r\nexport const description = {\r\n fontSize: 'var(--mantine-font-size-xs)',\r\n};\r\n\r\nexport const genericInputStyles = {\r\n styles: {\r\n label: label,\r\n error: error,\r\n description: description,\r\n \r\n input:{\r\n backgroundColor: 'rgba(76, 76, 76, 0.3)', \r\n minHeight: '4vh',\r\n },\r\n },\r\n};\r\n\r\nconst theme = createTheme({\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n defaultRadius: \"xs\",\r\n fontFamily: \"Akrobat Regular, sans-serif\",\r\n\r\n radius:{\r\n xxs: '0.3vh',\r\n xs: '0.5vh',\r\n sm: '0.75vh',\r\n md: '1vh',\r\n lg: '1.5vh',\r\n xl: '2vh',\r\n xxl: '3vh',\r\n },\r\n\r\n fontSizes: {\r\n xxs: '1.2vh',\r\n xs: '1.5vh',\r\n sm: '1.8vh',\r\n md: '2.2vh',\r\n lg: '2.8vh',\r\n xl: '3.3vh',\r\n xxl: '3.8vh',\r\n },\r\n\r\n lineHeights: {\r\n xxs: '1.4vh',\r\n xs: '1.8vh',\r\n sm: '2.2vh',\r\n md: '2.8vh',\r\n lg: '3.3vh',\r\n xl: '3.8vh',\r\n },\r\n\r\n spacing:{\r\n xxs: '0.5vh',\r\n xs: '0.75vh',\r\n sm: '1.5vh',\r\n md: '2vh',\r\n lg: '3vh',\r\n xl: '4vh',\r\n xxl: '5vh',\r\n },\r\n\r\n components:{\r\n Progress:{\r\n styles:{\r\n label: {\r\n fontFamily: 'Akrobat Bold',\r\n letterSpacing: '0.05em',\r\n textTransform: 'uppercase', \r\n },\r\n\r\n root:{\r\n backgroundColor: 'rgba(77, 77, 77, 0.4)',\r\n },\r\n \r\n }\r\n },\r\n \r\n \r\n Input: genericInputStyles,\r\n TextInput: genericInputStyles,\r\n NumberInput: genericInputStyles,\r\n Select: genericInputStyles,\r\n MultiSelect: genericInputStyles, \r\n Textarea: genericInputStyles,\r\n ColorInput: genericInputStyles,\r\n DateInput: genericInputStyles,\r\n\r\n Pill: {\r\n styles: (theme: MantineTheme) => ({\r\n root: {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: 'rgba(76, 76, 76, 0.3)',\r\n height: 'fit-content',\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.05em',\r\n fontFamily: 'Akrobat Bold',\r\n fontSize: '1.25vh',\r\n borderRadius: theme.defaultRadius,\r\n paddingBottom: '0.5vh',\r\n paddingTop: '0.5vh',\r\n }\r\n })\r\n },\r\n\r\n },\r\n\r\n colors: {\r\n\r\n dirk:[\r\n \"#ffffff\",\r\n \"#f3fce9\",\r\n \"#dbf5bd\",\r\n \"#c3ee91\",\r\n \"#ace765\",\r\n \"#94e039\",\r\n \"#7ac61f\",\r\n \"#5f9a18\",\r\n \"#29420a\",\r\n \"#446e11\",\r\n ],\r\n },\r\n});\r\n\r\n\r\nexport default theme;","export const isEnvBrowser = (): boolean => !(window as any).invokeNative;\r\n\r\n// Basic no operation function\r\nexport const noop = () => {};\r\n\r\nexport const splitFAString = (faString:string) => {\r\n const [prefix, newIcon] = faString.split('-');\r\n if (!prefix || !newIcon) return {prefix: 'fas', newIcon: 'question'};\r\n return {prefix, newIcon};\r\n}\r\n\r\nexport const numberToRoman = (num:number) => {\r\n const romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX'] \r\n return romanNumerals[num]\r\n}\r\n\r\nexport const copyToClipboard = (text:string) => {\r\n const el = document.createElement('textarea');\r\n el.value = text;\r\n document.body.appendChild(el);\r\n el.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(el);\r\n}\r\n\r\nexport const openLink = (url:string) => {\r\n if (isEnvBrowser()) {\r\n window.open(url, '_blank');\r\n } else {\r\n // @ts-expect-error -- invokeNative exists in NUI\r\n window.invokeNative('openLink', url);\r\n } \r\n}","import { MantineColorsTuple } from \"@mantine/core\";\r\nimport { create } from \"zustand\";\r\n\r\nexport type SettingsState = {\r\n game: \"fivem\" | \"rdr3\";\r\n currency: string;\r\n primaryColor: string;\r\n primaryShade: number;\r\n itemImgPath: string;\r\n customTheme?: MantineColorsTuple;\r\n overideResourceName?: string;\r\n};\r\n\r\nexport const useSettings = create<SettingsState>(() => ({\r\n currency: \"$\",\r\n game: \"fivem\",\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n itemImgPath: \"\",\r\n customTheme: [\r\n \"#f0f4ff\",\r\n \"#d9e3ff\",\r\n \"#bfcfff\",\r\n \"#a6bbff\",\r\n \"#8ca7ff\",\r\n \"#7393ff\",\r\n \"#5a7fff\",\r\n \"#406bff\",\r\n \"#2547ff\",\r\n \"#0b33ff\",\r\n ],\r\n}));\r\n\r\n// registerInitialFetch<Partial<SettingsState>>('GET_SETTINGS', undefined).then((data) => {\r\n// if (!data) {\r\n// console.warn('No settings data received from GET_SETTINGS fetch.');\r\n// return;\r\n// }\r\n// useSettings.setState({\r\n// ...data,\r\n// });\r\n// })\r\n","import { useEffect } from \"react\";\r\nimport { isEnvBrowser } from \"./misc\";\r\nimport { useSettings } from \"./useSettings\";\r\n\r\n/**\r\n * Simple wrapper around fetch API tailored for CEF/NUI use.\r\n */\r\nexport async function fetchNui<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T,\r\n): Promise<T> {\r\n const options = {\r\n method: \"post\",\r\n headers: {\r\n \"Content-Type\": \"application/json; charset=UTF-8\",\r\n },\r\n body: JSON.stringify(data),\r\n };\r\n\r\n if (isEnvBrowser() && mockData !== undefined) return mockData;\r\n if (isEnvBrowser() && mockData === undefined) {\r\n console.warn(\r\n `[fetchNui] Called fetchNui for event \"${eventName}\" in browser environment without mockData. Returning empty object.`,\r\n );\r\n return {} as T;\r\n }\r\n\r\n const overrideResourceName = useSettings.getState().overideResourceName;\r\n\r\n const resourceName = (window as any).GetParentResourceName\r\n ? (window as any).GetParentResourceName()\r\n : overrideResourceName ? overrideResourceName : \"dirk-cfx-react\";\r\n const resp = await fetch(`https://${resourceName}/${eventName}`, options);\r\n return await resp.json();\r\n}\r\n\r\n// -----------------------------\r\n// Initial fetch registration\r\n// -----------------------------\r\nexport type InitialFetch<T> = () => Promise<T>;\r\nexport const initialFetches: Record<string, InitialFetch<unknown>> = {};\r\n\r\n/**\r\n * Registers an initial fetch that automatically uses fetchNui.\r\n * Works like:\r\n * ```ts\r\n * registerInitialFetch<{ name: string }>(\"MY_EVENT_NAME\", undefined, { name: \"Mocky\" });\r\n * ```\r\n * and returns a Promise resolving to the same type as fetchNui.\r\n */\r\nexport async function registerInitialFetch<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T,\r\n): Promise<T> {\r\n const fetcher = () => fetchNui<T>(eventName, data, mockData);\r\n initialFetches[eventName] = fetcher;\r\n return fetcher(); // run immediately if needed\r\n}\r\n\r\n/**\r\n * Runs all registered initial fetches in parallel.\r\n */\r\nexport async function runFetches() {\r\n return Promise.all(\r\n Object.entries(initialFetches).map(async ([eventName, fetcher]) => {\r\n const data = await fetcher();\r\n return { eventName, data };\r\n }),\r\n );\r\n}\r\n\r\n/**\r\n * React hook to automatically run all registered fetches on mount.\r\n */\r\nexport const useAutoFetcher = () => {\r\n useEffect(() => {\r\n if (isEnvBrowser()) return;\r\n const run = async () => {\r\n const results = await runFetches();\r\n };\r\n run();\r\n }, []);\r\n};\r\n\r\n\r\nexport const fetchLuaTable = <T>(tableName: string, mockData?: T): Promise<T> => { \r\n return fetchNui<T>('FETCH_LUA_TABLE', { tableName }, mockData);\r\n} \r\n\r\nexport const registerInitialLuaTableFetch = <T>(tableName: string, mockData?: T): Promise<T> => { \r\n return registerInitialFetch<T>('FETCH_LUA_TABLE', { tableName }, mockData);\r\n} \r\n\r\n\r\n\r\n// useage example:\r\n// registerInitialLuaTableFetch<{ [key: string]: string }>('my_lua_table', { key1: 'value1', key2: 'value2' }); \r\n","import type { MantineColorsTuple, MantineThemeOverride } from \"@mantine/core\";\r\n\r\nconst isValidColorScale = (v: unknown): v is MantineColorsTuple =>\r\n Array.isArray(v) && v.length === 10 && v.every((shade) => typeof shade === \"string\");\r\n\r\nexport function mergeMantineThemeSafe(\r\n base: MantineThemeOverride,\r\n custom?: MantineColorsTuple,\r\n override?: MantineThemeOverride\r\n): MantineThemeOverride {\r\n const colors = { ...base.colors };\r\n\r\n if (custom && isValidColorScale(custom)) {\r\n colors[\"custom\"] = custom;\r\n } \r\n\r\n return {\r\n ...base,\r\n ...override,\r\n colors: {\r\n ...colors,\r\n ...(override?.colors ?? {}),\r\n },\r\n };\r\n}\r\n","\r\n\r\n// This is a function that you will call and it will return liek so \r\n// const {useScriptSettings, useScriptSettingHooks} = createScriptSettings<YourTypeHere>({\r\n// key1: 'your_unique_value1',\r\n// key2: {}\r\n// subKey1: 'your_unique_value2',\r\n// subKey2: 'your_unique_value3'\r\n// }\r\n// })\r\n\r\nimport { fetchNui } from \"@/utils\";\r\nimport { create } from \"zustand\";\r\ntype NuiResponse = { success: boolean; message: string };\r\n\r\n// Global registry — DirkProvider dispatches here so apps need zero setup boilerplate\r\nconst _scriptSettingsUpdaters: ((data: unknown) => void)[] = [];\r\n\r\nexport function _dispatchScriptSettingsUpdate(data: unknown) {\r\n _scriptSettingsUpdaters.forEach(fn => fn(data));\r\n}\r\n\r\nexport function createScriptSettings<T>(defaultValue: T) {\r\n const store = create<T>(() => defaultValue);\r\n\r\n // Register this store's updater into the global registry\r\n _scriptSettingsUpdaters.push((data: unknown) => {\r\n store.setState((prev) => ({ ...prev, ...(data as Partial<T>) }));\r\n });\r\n\r\n // kept for backward compatibility — no longer needs to be called\r\n const useScriptSettingHooks = () => {};\r\n\r\n const updateScriptSettings = async (newSettings: Partial<T>): Promise<NuiResponse> => {\r\n store.setState((prev) => ({ ...prev, ...newSettings }));\r\n return await fetchNui<NuiResponse>(\"UPDATE_SCRIPT_SETTINGS\", newSettings);\r\n };\r\n\r\n return {store, updateScriptSettings, useScriptSettingHooks}\r\n} \r\n\r\n\r\n","import { MutableRefObject, useEffect, useRef } from \"react\";\r\nimport { noop } from \"../utils/misc\";\r\n\r\nexport interface NuiMessageData<T = unknown> {\r\n action: string;\r\n data: T;\r\n}\r\n\r\nexport type NuiHandlerSignature<T> = ( data: T) => void;\r\n\r\n/**\r\n * A hook that manage events listeners for receiving data from the client scripts\r\n * @param action The specific `action` that should be listened for.\r\n * @param handler The callback function that will handle data relayed by this hook\r\n *\r\n * @example\r\n * useNuiEvent<{visibility: true, wasVisible: 'something'}>('setVisible', (data) => {\r\n * // whatever logic you want\r\n * })\r\n *\r\n **/\r\n\r\nexport const useNuiEvent = <T = unknown>(\r\n action: string,\r\n handler: ( data: T) => void,\r\n) => {\r\n const savedHandler: MutableRefObject<NuiHandlerSignature<T>> = useRef(noop);\r\n\r\n // Make sure we handle for a reactive handler\r\n useEffect(() => {\r\n savedHandler.current = handler;\r\n }, [handler]);\r\n\r\n useEffect(() => {\r\n const eventListener = (event: MessageEvent<NuiMessageData<T>>) => {\r\n const { action: eventAction, data } = event.data;\r\n\r\n if (savedHandler.current) {\r\n if (eventAction === action) {\r\n savedHandler.current( data);\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener(\"message\", eventListener);\r\n // Remove Event Listener on component dirkup\r\n return () => window.removeEventListener(\"message\", eventListener);\r\n }, [action]);\r\n};\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { Box, Code, Stack, Text, Title } from \"@mantine/core\";\r\n\r\ntype State = {\r\n error: Error | null;\r\n stack?: string;\r\n};\r\n\r\nexport class DirkErrorBoundary extends React.Component<\r\n { children: React.ReactNode },\r\n State\r\n> {\r\n state: State = { error: null, stack: undefined };\r\n\r\n static getDerivedStateFromError(error: Error) {\r\n // We can't get component stack here, so just store the error\r\n return { error };\r\n }\r\n\r\n componentDidCatch(error: Error, info: React.ErrorInfo) {\r\n console.group(\"🔥 Dirk UI Crash\");\r\n console.error(\"Error:\", error);\r\n console.error(\"Component Stack:\", info.componentStack);\r\n console.groupEnd();\r\n\r\n // Only log here, don't call setState — the error state is already captured\r\n }\r\n\r\n render() {\r\n if (!this.state.error) return this.props.children;\r\n\r\n return (\r\n <Box\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n width: \"100vw\",\r\n height: \"100vh\",\r\n background: \"rgba(10, 10, 12, 0.92)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"2rem\",\r\n zIndex: 999999,\r\n }}\r\n >\r\n <Box\r\n maw={900}\r\n w=\"100%\"\r\n p=\"lg\"\r\n style={{\r\n background: \"rgba(20,20,24,0.75)\",\r\n border: \"1px solid rgba(255,255,255,0.08)\",\r\n borderRadius: \"10px\",\r\n boxShadow: \"0 10px 40px rgba(0,0,0,0.6)\",\r\n }}\r\n >\r\n <Stack gap=\"sm\">\r\n <Title order={2} c=\"red.5\">\r\n Dirk UI Crash\r\n </Title>\r\n\r\n <Text c=\"dimmed\" size=\"sm\">\r\n The interface encountered a fatal error and stopped rendering.\r\n </Text>\r\n\r\n <Code block style={{ maxHeight: 150, overflow: \"auto\" }}>\r\n {this.state.error?.message}\r\n </Code>\r\n\r\n {/* Optional: show component stack if you pass it from props */}\r\n <Text size=\"xs\" c=\"dimmed\">\r\n Check console for full stack trace\r\n </Text>\r\n </Stack>\r\n </Box>\r\n </Box>\r\n );\r\n }\r\n}","\"use client\";\r\n\r\nimport \"@mantine/core/styles.css\";\r\nimport \"@mantine/notifications/styles.css\";\r\nimport './styles/fonts.css';\r\nimport './styles/notify.css';\r\nimport './styles/scrollBar.css';\r\nimport './styles/tornEdge.css';\r\n\r\n\r\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { fab } from \"@fortawesome/free-brands-svg-icons\";\r\nimport { far } from \"@fortawesome/free-regular-svg-icons\";\r\nimport { fas } from \"@fortawesome/free-solid-svg-icons\";\r\nlibrary.add(fas, far, fab);\r\n\r\nimport theme from \"@/theme\";\r\nimport { BackgroundImage, MantineColorShade, MantineProvider } from \"@mantine/core\";\r\nimport { useEffect, useLayoutEffect, useMemo } from \"react\";\r\n\r\nimport { fetchNui, isEnvBrowser } from \"@/utils\";\r\nimport { mergeMantineThemeSafe } from \"@/utils/mergeMantineTheme\";\r\nimport { SettingsState, useSettings } from \"@/utils/useSettings\";\r\nimport { _dispatchScriptSettingsUpdate } from \"@/hooks/useScriptSettings\";\r\nimport { useNuiEvent } from \"@/hooks\";\r\nimport { DirkErrorBoundary } from \"./DirkErrorBoundary\";\r\n\r\nexport type DirkProviderProps = {\r\n children: React.ReactNode;\r\n overideResourceName?: string;\r\n themeOverride?: any;\r\n};\r\n\r\nexport function DirkProvider({ children, overideResourceName, themeOverride }: DirkProviderProps) {\r\n const {\r\n primaryColor,\r\n primaryShade,\r\n customTheme,\r\n game,\r\n } = useSettings();\r\n\r\n useLayoutEffect(() => {\r\n useSettings.setState({\r\n overideResourceName,\r\n });\r\n }, [overideResourceName]);\r\n\r\n useEffect(() => {\r\n fetchNui('NUI_READY').catch(() => {});\r\n fetchNui<Partial<SettingsState>>('GET_SETTINGS').then((data) => {\r\n useSettings.setState({\r\n ...data,\r\n });\r\n }).catch((err) => {\r\n console.error(\"Failed to fetch initial settings within dirk-cfx-react:\", err);\r\n });\r\n }, []);\r\n\r\n useNuiEvent<unknown>('UPDATE_SCRIPT_SETTINGS', _dispatchScriptSettingsUpdate);\r\n\r\n // 🚫 do not render until state is stable\r\n\r\n const mergedTheme = useMemo(\r\n () =>\r\n mergeMantineThemeSafe(\r\n { ...theme, primaryColor, primaryShade: primaryShade as MantineColorShade },\r\n customTheme,\r\n themeOverride\r\n ),\r\n [primaryColor, primaryShade, customTheme, themeOverride]\r\n );\r\n\r\n useEffect(() => {\r\n document.body.style.fontFamily =\r\n game === \"rdr3\"\r\n ? '\"Red Dead\", sans-serif'\r\n : '\"Akrobat Regular\", sans-serif';\r\n }, [game]);\r\n\r\n const content = isEnvBrowser() ? (\r\n <BackgroundImage\r\n w=\"100vw\"\r\n h=\"100vh\"\r\n src={game === \"fivem\"\r\n ? \"https://i.ytimg.com/vi/TOxuNbXrO28/maxresdefault.jpg\"\r\n : \"https://raw.githubusercontent.com/Jump-On-Studios/RedM-jo_libs/refs/heads/main/source-repositories/Menu/public/assets/images/background_dev.jpg\"}\r\n >\r\n {children}\r\n </BackgroundImage>\r\n ) : (\r\n children\r\n );\r\n\r\n return (\r\n <MantineProvider theme={mergedTheme} defaultColorScheme=\"dark\">\r\n <DirkErrorBoundary>\r\n {content}\r\n </DirkErrorBoundary>\r\n </MantineProvider>\r\n );\r\n}\r\n"]}
|