dirk-cfx-react 1.1.58 → 1.1.64

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.
@@ -465,46 +465,50 @@ async function fetchNui(eventName, data, mockData) {
465
465
  }
466
466
  const overrideResourceName = useSettings.getState().overideResourceName;
467
467
  const resourceName = window.GetParentResourceName ? window.GetParentResourceName() : overrideResourceName ? overrideResourceName : "dirk-cfx-react";
468
- const resp = await fetch(`https://${resourceName}/${eventName}`, options);
469
- return await resp.json();
468
+ try {
469
+ const resp = await fetch(`https://${resourceName}/${eventName}`, options);
470
+ return await resp.json();
471
+ } catch {
472
+ return mockData ?? {};
473
+ }
470
474
  }
471
475
  var _instance = null;
472
- function getScriptSettingsInstance() {
473
- if (!_instance) throw new Error("[dirk-cfx-react] createScriptSettings must be called before using SettingsPanel");
476
+ function getScriptConfigInstance() {
477
+ if (!_instance) throw new Error("[dirk-cfx-react] createScriptConfig must be called before using ConfigPanel");
474
478
  return _instance;
475
479
  }
476
- function createScriptSettings(defaultValue) {
480
+ function createScriptConfig(defaultValue) {
477
481
  const store = zustand.create(() => defaultValue);
478
482
  let clientVersion = 0;
479
- const useScriptSettingHooks = () => {
480
- useNuiEvent("UPDATE_SCRIPT_SETTINGS", (data) => {
483
+ const useScriptConfigHooks = () => {
484
+ useNuiEvent("UPDATE_SCRIPT_CONFIG", (data) => {
481
485
  if (!data) return;
482
486
  if (typeof data.clientVersion === "number") {
483
487
  clientVersion = data.clientVersion;
484
488
  }
485
- if (data.settings && typeof data.settings === "object") {
486
- store.setState((prev) => ({ ...prev, ...data.settings }));
489
+ if (data.config && typeof data.config === "object") {
490
+ store.setState((prev) => ({ ...prev, ...data.config }));
487
491
  }
488
492
  });
489
493
  };
490
- const fetchScriptSettings = async () => {
494
+ const fetchScriptConfig = async () => {
491
495
  try {
492
- const response = await fetchNui("GET_FULL_SCRIPT_SETTINGS");
493
- if (response?.success && response.data?.settings) {
494
- store.setState(() => response.data.settings);
496
+ const response = await fetchNui("GET_FULL_SCRIPT_CONFIG");
497
+ if (response?.success && response.data?.config) {
498
+ store.setState(() => response.data.config);
495
499
  if (typeof response.data.clientVersion === "number") {
496
500
  clientVersion = response.data.clientVersion;
497
501
  }
498
- return response.data.settings;
502
+ return response.data.config;
499
503
  }
500
504
  } catch {
501
505
  }
502
506
  return null;
503
507
  };
504
- const updateScriptSettings = async (newSettings) => {
505
- store.setState((prev) => ({ ...prev, ...newSettings }));
506
- const response = await fetchNui("UPDATE_SCRIPT_SETTINGS", {
507
- data: newSettings,
508
+ const updateScriptConfig = async (newConfig) => {
509
+ store.setState((prev) => ({ ...prev, ...newConfig }));
510
+ const response = await fetchNui("UPDATE_SCRIPT_CONFIG", {
511
+ data: newConfig,
508
512
  expectedVersion: clientVersion
509
513
  });
510
514
  if (response?.meta?.client_version != null) {
@@ -515,23 +519,34 @@ function createScriptSettings(defaultValue) {
515
519
  }
516
520
  return response;
517
521
  };
518
- const getScriptSettingsHistory = async (params = {}) => {
519
- return fetchNui("GET_SCRIPT_SETTINGS_HISTORY", params);
522
+ const getScriptConfigHistory = async (params = {}) => {
523
+ return fetchNui("GET_SCRIPT_CONFIG_HISTORY", params);
524
+ };
525
+ const resetConfig = async () => {
526
+ const response = await fetchNui("RESET_SCRIPT_CONFIG");
527
+ if (response?.success) {
528
+ const fresh = await fetchScriptConfig();
529
+ if (fresh) {
530
+ store.setState(() => fresh);
531
+ }
532
+ }
533
+ return response;
520
534
  };
521
535
  _instance = {
522
536
  store,
523
- updateSettings: updateScriptSettings,
524
- getHistory: getScriptSettingsHistory,
525
- fetchSettings: fetchScriptSettings
537
+ updateConfig: updateScriptConfig,
538
+ resetConfig,
539
+ getHistory: getScriptConfigHistory,
540
+ fetchConfig: fetchScriptConfig
526
541
  };
527
- return { store, updateScriptSettings, getScriptSettingsHistory, useScriptSettingHooks, fetchScriptSettings };
542
+ return { store, updateScriptConfig, resetConfig, getScriptConfigHistory, useScriptConfigHooks, fetchScriptConfig };
528
543
  }
529
544
 
530
545
  exports.FormProvider = FormProvider;
531
546
  exports.TornEdgeSVGFilter = TornEdgeSVGFilter;
532
547
  exports.createFormStore = createFormStore;
533
- exports.createScriptSettings = createScriptSettings;
534
- exports.getScriptSettingsInstance = getScriptSettingsInstance;
548
+ exports.createScriptConfig = createScriptConfig;
549
+ exports.getScriptConfigInstance = getScriptConfigInstance;
535
550
  exports.useAudio = useAudio;
536
551
  exports.useForm = useForm;
537
552
  exports.useFormActions = useFormActions;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useAudio/store.ts","../../src/utils/misc.ts","../../src/hooks/useNuiEvent.ts","../../src/hooks/useForm.tsx","../../src/utils/useSettings.ts","../../src/hooks/useTornEdges.tsx","../../src/utils/fetchNui.ts","../../src/hooks/useScriptSettings.ts"],"names":["create","clickSoundUrl","hoverSoundUrl","useRef","useEffect","createStore","createContext","useContext","useStore","useMemo","jsx","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { create } from 'zustand';\r\n\r\n// Import sounds as URLs (TypeScript-safe)\r\nimport clickSoundUrl from './click_sound.mp3';\r\nimport hoverSoundUrl from './hover_sound.mp3';\r\n\r\n// Define a type for the store state and actions\r\ntype AudioPlayerStore = {\r\n play: (sound: string) => void;\r\n stop: (sound: string) => void;\r\n};\r\n\r\n// Create the store using Zustand\r\nexport const useAudio = create<AudioPlayerStore>(() => {\r\n const audioRefs: Record<string, HTMLAudioElement> = {};\r\n\r\n // Predefined sounds\r\n const sounds: Record<string, string> = {\r\n click: clickSoundUrl,\r\n hover: hoverSoundUrl,\r\n };\r\n\r\n // Initialize audio elements for each sound\r\n for (const [key, src] of Object.entries(sounds)) {\r\n audioRefs[key] = new Audio(src);\r\n }\r\n\r\n return {\r\n play: (sound) => {\r\n const audio = audioRefs[sound];\r\n if (!audio) return console.warn(`Sound '${sound}' not found.`);\r\n audio.currentTime = 0;\r\n audio.volume = 0.1;\r\n audio.play();\r\n },\r\n stop: (sound) => {\r\n const audio = audioRefs[sound];\r\n if (!audio) return console.warn(`Sound '${sound}' not found.`);\r\n audio.pause();\r\n audio.currentTime = 0;\r\n },\r\n };\r\n});\r\n","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 { 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","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport React, { createContext, useContext, useMemo, useRef } from \"react\";\r\nimport { createStore, StoreApi, useStore } from \"zustand\";\r\n\r\n/* ======================================================\r\n Type Utilities\r\n====================================================== */\r\n\r\ntype PathValue<T, P extends string> = P extends keyof T\r\n ? T[P]\r\n : P extends `${infer K}.${infer R}`\r\n ? K extends keyof T\r\n ? PathValue<T[K], R>\r\n : never\r\n : never;\r\n\r\ntype Paths<T> = T extends object\r\n ? {\r\n [K in keyof T]: K extends string\r\n ? T[K] extends object\r\n ? T[K] extends any[] | Date | Function\r\n ? K\r\n : K | `${K}.${Paths<T[K]>}`\r\n : K\r\n : never;\r\n }[keyof T]\r\n : never;\r\n\r\ntype LoosePaths<T> = Paths<T> | (string & {});\r\n\r\n/* ======================================================\r\n Utilities\r\n====================================================== */\r\n\r\nfunction getNested(obj: any, path: string): any {\r\n return path.split(\".\").reduce((acc, key) => (acc ? acc[key] : undefined), obj);\r\n}\r\n\r\nfunction setNested(obj: any, path: string, value: any): any {\r\n const keys = path.split(\".\");\r\n const root = Array.isArray(obj) ? [...obj] : { ...obj };\r\n let current = root;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n const nextKey = keys[i + 1];\r\n const isIndex = !isNaN(Number(nextKey));\r\n\r\n const existing = current[key];\r\n\r\n current[key] =\r\n existing != null\r\n ? Array.isArray(existing)\r\n ? [...existing]\r\n : { ...existing }\r\n : isIndex\r\n ? []\r\n : {};\r\n\r\n current = current[key];\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n return root;\r\n}\r\n\r\nfunction deleteNested(obj: any, path: string): any {\r\n const keys = path.split(\".\");\r\n const newObj = { ...obj };\r\n let current = newObj;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!current[key]) return obj;\r\n current[key] = { ...current[key] };\r\n current = current[key];\r\n }\r\n\r\n delete current[keys[keys.length - 1]];\r\n return newObj;\r\n}\r\n\r\nfunction isPlainObject(value: any): value is Record<string, any> {\r\n return (\r\n value !== null &&\r\n typeof value === \"object\" &&\r\n !Array.isArray(value) &&\r\n !(value instanceof Date)\r\n );\r\n}\r\n\r\nfunction collectChangedPaths(values: any, initial: any, prefix = \"\"): string[] {\r\n if (Object.is(values, initial)) return [];\r\n\r\n const valuesIsObj = isPlainObject(values);\r\n const initialIsObj = isPlainObject(initial);\r\n const valuesIsArr = Array.isArray(values);\r\n const initialIsArr = Array.isArray(initial);\r\n\r\n if (valuesIsArr || initialIsArr) {\r\n const maxLen = Math.max(values?.length ?? 0, initial?.length ?? 0);\r\n const fields: string[] = [];\r\n for (let i = 0; i < maxLen; i++) {\r\n const nextPrefix = prefix ? `${prefix}.${i}` : `${i}`;\r\n fields.push(...collectChangedPaths(values?.[i], initial?.[i], nextPrefix));\r\n }\r\n return fields;\r\n }\r\n\r\n if (valuesIsObj || initialIsObj) {\r\n const keys = new Set([\r\n ...Object.keys(values ?? {}),\r\n ...Object.keys(initial ?? {}),\r\n ]);\r\n const fields: string[] = [];\r\n for (const key of keys) {\r\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\r\n fields.push(...collectChangedPaths(values?.[key], initial?.[key], nextPrefix));\r\n }\r\n return fields;\r\n }\r\n\r\n return prefix ? [prefix] : [];\r\n}\r\n\r\nfunction computeChangedState<T>(\r\n values: Partial<T>,\r\n initialVals: Partial<T>\r\n): { fields: string[]; partial: Partial<T> } {\r\n const fields = collectChangedPaths(values, initialVals);\r\n let partial: Partial<T> = {};\r\n\r\n for (const path of fields) {\r\n partial = setNested(partial, path, getNested(values, path));\r\n }\r\n\r\n return { fields, partial };\r\n}\r\n\r\nfunction flattenRules(\r\n rules: any,\r\n prefix = \"\"\r\n): Record<string, ValidatorFn> {\r\n const result: Record<string, ValidatorFn> = {};\r\n\r\n for (const key in rules) {\r\n const fullPath = prefix ? `${prefix}.${key}` : key;\r\n const val = rules[key];\r\n\r\n if (typeof val === \"function\") result[fullPath] = val;\r\n else if (typeof val === \"object\")\r\n Object.assign(result, flattenRules(val, fullPath));\r\n }\r\n\r\n return result;\r\n}\r\n\r\nasync function runRule(\r\n rule: ValidatorFn,\r\n value: any,\r\n values: any\r\n): Promise<string | null> {\r\n const result = rule(value, values);\r\n return result instanceof Promise ? await result : result;\r\n}\r\n\r\n/* ======================================================\r\n Types\r\n====================================================== */\r\n\r\nexport type ValidatorFn<T = any> =\r\n | ((value: any, values: Partial<T>) => string | null)\r\n | ((value: any, values: Partial<T>) => Promise<string | null>);\r\n\r\nexport type ValidationRules<T> = {\r\n [K in keyof T]?: T[K] extends object\r\n ? ValidationRules<T[K]>\r\n : ValidatorFn<T>;\r\n};\r\n\r\nexport type FormState<T> = {\r\n values: Partial<T>;\r\n initialValues: Partial<T>;\r\n errors: Record<string, string>;\r\n\r\n partialChanged: Partial<T>;\r\n\r\n getInputProps: (path: string) => {\r\n value: any;\r\n error?: string;\r\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n };\r\n\r\n setValue: (path: string, value: any, options?: { validate?: boolean }) => void;\r\n setInitialValues: (newInitialValues: Partial<T>) => void;\r\n\r\n setError: (path: string, message: string) => void;\r\n clearError: (path: string) => void;\r\n\r\n validate: () => Promise<boolean>;\r\n validateField: (path: string) => Promise<boolean>;\r\n\r\n reset: () => void;\r\n reinitialize: (newValues: Partial<T>) => void;\r\n\r\n back: () => void;\r\n forward: () => void;\r\n canBack: boolean;\r\n canForward: boolean;\r\n\r\n changedFields: string[];\r\n changedCount: number;\r\n resetChangeCount: () => void;\r\n\r\n onSubmit?: (form: FormState<T>) => void;\r\n submit: () => Promise<void>;\r\n};\r\n\r\n/* ======================================================\r\n Store\r\n====================================================== */\r\n\r\nexport function createFormStore<T>(\r\n initialValues: Partial<T>,\r\n validationRules?: ValidationRules<T>,\r\n onSubmit?: (form: FormState<T>) => void\r\n) {\r\n const flatRules = validationRules ? flattenRules(validationRules) : {};\r\n\r\n const history: Partial<T>[] = [];\r\n const future: Partial<T>[] = [];\r\n const changed = new Set<string>();\r\n\r\n return createStore<FormState<T>>((set, get) => ({\r\n initialValues,\r\n values: initialValues,\r\n errors: {},\r\n partialChanged: {},\r\n canBack: false,\r\n canForward: false,\r\n changedFields: [],\r\n changedCount: 0,\r\n onSubmit,\r\n\r\n submit: async () => {\r\n const state = get();\r\n const isValid = await state.validate();\r\n if (isValid && state.onSubmit) {\r\n state.onSubmit(get());\r\n }\r\n },\r\n\r\n getInputProps: (path: string) => {\r\n return {\r\n value: getNested(get().values, path) ?? \"\",\r\n error: get().errors[path],\r\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\r\n get().setValue(path, e.target.value, { validate: true });\r\n },\r\n };\r\n },\r\n\r\n resetChangeCount: () => {\r\n changed.clear();\r\n set({ changedFields: [], changedCount: 0, partialChanged: {} });\r\n },\r\n\r\n setInitialValues: (newInitialValues) =>\r\n set({ initialValues: newInitialValues }),\r\n\r\n setValue: (path, value, options) => {\r\n const state = get();\r\n const currentValues = state.values;\r\n const newValues = setNested(currentValues, path, value);\r\n\r\n const oldValue = getNested(state.initialValues, path);\r\n const hasChanged = value !== oldValue;\r\n\r\n history.push(currentValues);\r\n future.length = 0;\r\n\r\n let newPartial = state.partialChanged;\r\n\r\n if (hasChanged) {\r\n changed.add(path);\r\n newPartial = setNested(newPartial, path, value);\r\n } else {\r\n changed.delete(path);\r\n newPartial = deleteNested(newPartial, path);\r\n }\r\n\r\n set({\r\n values: newValues,\r\n partialChanged: newPartial,\r\n canBack: history.length > 0,\r\n canForward: false,\r\n changedFields: Array.from(changed),\r\n changedCount: changed.size,\r\n });\r\n\r\n if (!options?.validate) return;\r\n\r\n const rule = flatRules[path];\r\n if (!rule) return;\r\n\r\n Promise.resolve(runRule(rule, value, newValues)).then((error) => {\r\n if (error)\r\n set((s) => ({ errors: setNested(s.errors, path, error) }));\r\n else\r\n set((s) => ({ errors: deleteNested(s.errors, path) }));\r\n });\r\n },\r\n\r\n setError: (path, message) =>\r\n set((s) => ({ errors: setNested(s.errors, path, message) })),\r\n\r\n clearError: (path) =>\r\n set((s) => ({ errors: deleteNested(s.errors, path) })),\r\n\r\n validateField: async (path) => {\r\n const state = get();\r\n const rule = flatRules[path];\r\n if (!rule) return true;\r\n\r\n const value = getNested(state.values, path);\r\n const error = await runRule(rule, value, state.values);\r\n\r\n if (error) {\r\n set((s) => ({ errors: setNested(s.errors, path, error) }));\r\n return false;\r\n }\r\n\r\n set((s) => ({ errors: deleteNested(s.errors, path) }));\r\n return true;\r\n },\r\n\r\n validate: async () => {\r\n const state = get();\r\n let isValid = true;\r\n let newErrors: Record<string, string> = {};\r\n\r\n for (const path in flatRules) {\r\n const rule = flatRules[path];\r\n const value = getNested(state.values, path);\r\n const error = await runRule(rule, value, state.values);\r\n\r\n if (error) {\r\n isValid = false;\r\n newErrors = setNested(newErrors, path, error);\r\n }\r\n }\r\n\r\n set({ errors: newErrors });\r\n return isValid;\r\n },\r\n\r\n reset: () => {\r\n history.length = 0;\r\n future.length = 0;\r\n changed.clear();\r\n\r\n set({\r\n values: get().initialValues,\r\n errors: {},\r\n partialChanged: {},\r\n canBack: false,\r\n canForward: false,\r\n changedFields: [],\r\n changedCount: 0,\r\n });\r\n },\r\n\r\n reinitialize: (newValues) => {\r\n history.length = 0;\r\n future.length = 0;\r\n changed.clear();\r\n\r\n set({\r\n values: newValues,\r\n initialValues: newValues,\r\n errors: {},\r\n partialChanged: {},\r\n canBack: false,\r\n canForward: false,\r\n changedFields: [],\r\n changedCount: 0,\r\n });\r\n },\r\n\r\n back: () => {\r\n if (!history.length) return;\r\n\r\n const prev = history.pop()!;\r\n future.push(get().values);\r\n\r\n const { fields, partial } = computeChangedState(prev, get().initialValues);\r\n\r\n set({\r\n values: prev,\r\n partialChanged: partial,\r\n canBack: history.length > 0,\r\n canForward: true,\r\n changedFields: fields,\r\n changedCount: fields.length,\r\n });\r\n },\r\n\r\n forward: () => {\r\n if (!future.length) return;\r\n\r\n const next = future.pop()!;\r\n history.push(get().values);\r\n\r\n const { fields, partial } = computeChangedState(next, get().initialValues);\r\n\r\n set({\r\n values: next,\r\n partialChanged: partial,\r\n canBack: true,\r\n canForward: future.length > 0,\r\n changedFields: fields,\r\n changedCount: fields.length,\r\n });\r\n },\r\n }));\r\n}\r\n\r\n/* ======================================================\r\n Context + Hook\r\n====================================================== */\r\n\r\nconst FormContext = createContext<StoreApi<FormState<any>> | null>(null);\r\n\r\nexport function FormProvider<T>({\r\n initialValues,\r\n validate,\r\n onSubmit,\r\n children,\r\n}: {\r\n initialValues: Partial<T>;\r\n validate?: ValidationRules<T>;\r\n onSubmit?: (form: FormState<T>) => void;\r\n children: React.ReactNode;\r\n}) {\r\n const storeRef = useRef(\r\n createFormStore<T>(initialValues, validate, onSubmit)\r\n );\r\n\r\n return (\r\n <FormContext.Provider value={storeRef.current}>\r\n {children}\r\n </FormContext.Provider>\r\n );\r\n}\r\n\r\nexport function useForm<T>() {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useForm must be used inside <FormProvider>\");\r\n }\r\n const state = useStore(store) as FormState<T>;\r\n\r\n const changedFields = useMemo(() => {\r\n return collectChangedPaths(state.values, state.initialValues);\r\n }, [state.values, state.initialValues]);\r\n\r\n return { ...state, changedFields, changedCount: changedFields.length } as FormState<T>;\r\n}\r\n\r\nexport function useFormField<T, P extends LoosePaths<T> = LoosePaths<T>>(\r\n path: P\r\n): P extends Paths<T> ? PathValue<T, P> | undefined : any {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormField must be used inside <FormProvider>\");\r\n }\r\n return useStore(store, (s) => getNested(s.values, path));\r\n}\r\n\r\nexport function useFormFields<T, P extends LoosePaths<T> = LoosePaths<T>>(\r\n ...paths: P[]\r\n): { [K in P]: K extends Paths<T> ? PathValue<T, K> | undefined : any } {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormFields must be used inside <FormProvider>\");\r\n }\r\n \r\n return useStore(store, (s) => {\r\n const result = {} as { [K in P]: K extends Paths<T> ? PathValue<T, K> | undefined : any };\r\n for (const path of paths) {\r\n result[path] = getNested(s.values, path);\r\n }\r\n return result;\r\n });\r\n}\r\n\r\nexport function useFormError(path: string) {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormError must be used inside <FormProvider>\");\r\n }\r\n return useStore(store, (s) => s.errors[path]);\r\n}\r\n\r\nexport function useFormErrors(...paths: string[]) {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormErrors must be used inside <FormProvider>\");\r\n }\r\n return useStore(store, (s) => {\r\n const result: Record<string, string | undefined> = {};\r\n for (const path of paths) {\r\n result[path] = s.errors[path];\r\n }\r\n return result;\r\n });\r\n}\r\n\r\nexport function useFormActions<T>() {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormActions must be used inside <FormProvider>\");\r\n }\r\n return store.getState() as Pick<\r\n FormState<T>,\r\n | \"setValue\"\r\n | \"setError\"\r\n | \"clearError\"\r\n | \"validate\"\r\n | \"validateField\"\r\n | \"reset\"\r\n | \"reinitialize\"\r\n | \"back\"\r\n | \"forward\"\r\n | \"canBack\"\r\n | \"canForward\"\r\n | \"submit\"\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 resourceVersion?: 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 resourceVersion: \"dev\",\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 { useSettings } from \"@/utils/useSettings\";\r\nexport function useTornEdges() {\r\n const game = useSettings((state) => state.game);\r\n return game === \"rdr3\" ? \"torn-edge-wrapper\" : \"\";\r\n}\r\n\r\n// Add this SVG to your layout/root component:\r\nexport function TornEdgeSVGFilter() {\r\n return (\r\n <svg\r\n style={{ position: \"absolute\", width: 0, height: 0, pointerEvents: \"none\" }}\r\n aria-hidden=\"true\"\r\n >\r\n <defs>\r\n <filter id=\"torn-edge-filter\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\r\n {/* Base fractal noise for tearing */}\r\n <feTurbulence\r\n type=\"fractalNoise\"\r\n baseFrequency=\"0.018 0.022\"\r\n numOctaves=\"5\"\r\n seed=\"9\"\r\n result=\"noise1\"\r\n />\r\n {/* Second noise layer for micro detail */}\r\n <feTurbulence\r\n type=\"fractalNoise\"\r\n baseFrequency=\"0.08 0.12\"\r\n numOctaves=\"2\"\r\n seed=\"3\"\r\n result=\"noise2\"\r\n />\r\n\r\n {/* Blend both noise layers */}\r\n <feBlend in=\"noise1\" in2=\"noise2\" mode=\"multiply\" result=\"combinedNoise\" />\r\n\r\n {/* Primary displacement */}\r\n <feDisplacementMap\r\n in=\"SourceGraphic\"\r\n in2=\"combinedNoise\"\r\n scale=\"52\"\r\n xChannelSelector=\"R\"\r\n yChannelSelector=\"G\"\r\n result=\"displaced\"\r\n />\r\n\r\n {/* Alpha fade toward edges */}\r\n <feGaussianBlur stdDeviation=\"0.8\" in=\"displaced\" result=\"blurred\" />\r\n <feComponentTransfer in=\"blurred\" result=\"alphaFade\">\r\n <feFuncA type=\"gamma\" amplitude=\"1\" exponent=\"1.3\" offset=\"-0.05\" />\r\n </feComponentTransfer>\r\n\r\n {/* Sharpen a bit after fade */}\r\n <feMorphology operator=\"erode\" radius=\"0.4\" in=\"alphaFade\" result=\"eroded\" />\r\n\r\n {/* Merge final */}\r\n <feMerge>\r\n <feMergeNode in=\"eroded\" />\r\n </feMerge>\r\n </filter>\r\n </defs>\r\n </svg>\r\n );\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 { fetchNui } from \"@/utils\";\r\nimport { useNuiEvent } from \"@/hooks/useNuiEvent\";\r\nimport { create } from \"zustand\";\r\n\r\ntype ScriptSettingsUpdateMeta<T> = {\r\n client_version?: number;\r\n latestVersion?: number;\r\n latestData?: Partial<T>;\r\n changed_paths?: Array<{ path: string; old: unknown; new: unknown }>;\r\n lastEditor?: { source?: number; name?: string; identifier?: string };\r\n};\r\n\r\nexport type ScriptSettingsHistoryChange = {\r\n path: string;\r\n old: unknown;\r\n new: unknown;\r\n};\r\n\r\nexport type ScriptSettingsHistoryEntry = {\r\n at_unix: number;\r\n at_utc: string;\r\n script: string;\r\n admin?: { source?: number; name?: string; identifier?: string };\r\n expected_version?: number;\r\n applied_version?: number;\r\n changes: ScriptSettingsHistoryChange[];\r\n};\r\n\r\nexport type ScriptSettingsHistoryRequest = {\r\n offset?: number;\r\n limit?: number;\r\n query?: string;\r\n path?: string;\r\n admin?: string;\r\n fromUnix?: number;\r\n toUnix?: number;\r\n};\r\n\r\nexport type ScriptSettingsHistoryResponse = {\r\n success: boolean;\r\n _error?: string;\r\n data?: {\r\n items: ScriptSettingsHistoryEntry[];\r\n total: number;\r\n limit: number;\r\n offset: number;\r\n nextOffset?: number;\r\n };\r\n};\r\n\r\ntype NuiResponse<T> = {\r\n success: boolean;\r\n message?: string;\r\n _error?: string;\r\n meta?: ScriptSettingsUpdateMeta<T>;\r\n};\r\n\r\n// ── Singleton registry ────────────────────────────────────────────────────────\r\n\r\nexport interface ScriptSettingsInstance<T = any> {\r\n store: { getState: () => T; setState: (partial: Partial<T> | ((prev: T) => T)) => void };\r\n updateSettings: (newSettings: Partial<T>) => Promise<NuiResponse<T>>;\r\n getHistory: (params?: ScriptSettingsHistoryRequest) => Promise<ScriptSettingsHistoryResponse>;\r\n fetchSettings: () => Promise<T | null>;\r\n}\r\n\r\nlet _instance: ScriptSettingsInstance | null = null;\r\n\r\nexport function getScriptSettingsInstance<T = any>(): ScriptSettingsInstance<T> {\r\n if (!_instance) throw new Error(\"[dirk-cfx-react] createScriptSettings must be called before using SettingsPanel\");\r\n return _instance as ScriptSettingsInstance<T>;\r\n}\r\n\r\nexport function createScriptSettings<T>(defaultValue: T) {\r\n const store = create<T>(() => defaultValue);\r\n let clientVersion = 0;\r\n\r\n const useScriptSettingHooks = () => {\r\n useNuiEvent<{ settings?: Partial<T>; clientVersion?: number }>(\"UPDATE_SCRIPT_SETTINGS\", (data) => {\r\n if (!data) return;\r\n\r\n if (typeof data.clientVersion === \"number\") {\r\n clientVersion = data.clientVersion as number;\r\n }\r\n\r\n if (data.settings && typeof data.settings === \"object\") {\r\n store.setState((prev) => ({ ...prev, ...(data.settings as Partial<T>) }));\r\n }\r\n });\r\n };\r\n\r\n const fetchScriptSettings = async (): Promise<T | null> => {\r\n try {\r\n const response = await fetchNui<{\r\n success: boolean;\r\n data?: { settings: T; clientVersion: number };\r\n }>(\"GET_FULL_SCRIPT_SETTINGS\");\r\n\r\n if (response?.success && response.data?.settings) {\r\n store.setState(() => response.data!.settings as T);\r\n if (typeof response.data.clientVersion === \"number\") {\r\n clientVersion = response.data.clientVersion;\r\n }\r\n return response.data.settings;\r\n }\r\n } catch { /* fallback to current store state */ }\r\n return null;\r\n };\r\n\r\n const updateScriptSettings = async (newSettings: Partial<T>): Promise<NuiResponse<T>> => {\r\n store.setState((prev) => ({ ...prev, ...newSettings }));\r\n\r\n const response = await fetchNui<NuiResponse<T>>(\"UPDATE_SCRIPT_SETTINGS\", {\r\n data: newSettings,\r\n expectedVersion: clientVersion,\r\n });\r\n\r\n if (response?.meta?.client_version != null) {\r\n clientVersion = response.meta.client_version as number;\r\n }\r\n\r\n if (response?.success === false && response?.meta?.latestData) {\r\n store.setState((prev) => ({ ...prev, ...(response.meta!.latestData as Partial<T>) }));\r\n }\r\n\r\n return response;\r\n };\r\n\r\n const getScriptSettingsHistory = async (\r\n params: ScriptSettingsHistoryRequest = {}\r\n ): Promise<ScriptSettingsHistoryResponse> => {\r\n return fetchNui<ScriptSettingsHistoryResponse>('GET_SCRIPT_SETTINGS_HISTORY', params);\r\n };\r\n\r\n _instance = {\r\n store,\r\n updateSettings: updateScriptSettings,\r\n getHistory: getScriptSettingsHistory,\r\n fetchSettings: fetchScriptSettings,\r\n };\r\n\r\n return {store, updateScriptSettings, getScriptSettingsHistory, useScriptSettingHooks, fetchScriptSettings}\r\n} \r\n\r\n\r\n"]}
1
+ {"version":3,"sources":["../../src/hooks/useAudio/store.ts","../../src/utils/misc.ts","../../src/hooks/useNuiEvent.ts","../../src/hooks/useForm.tsx","../../src/utils/useSettings.ts","../../src/hooks/useTornEdges.tsx","../../src/utils/fetchNui.ts","../../src/hooks/useScriptConfig.ts"],"names":["create","clickSoundUrl","hoverSoundUrl","useRef","useEffect","createStore","createContext","useContext","useStore","useMemo","jsx","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { create } from 'zustand';\r\n\r\n// Import sounds as URLs (TypeScript-safe)\r\nimport clickSoundUrl from './click_sound.mp3';\r\nimport hoverSoundUrl from './hover_sound.mp3';\r\n\r\n// Define a type for the store state and actions\r\ntype AudioPlayerStore = {\r\n play: (sound: string) => void;\r\n stop: (sound: string) => void;\r\n};\r\n\r\n// Create the store using Zustand\r\nexport const useAudio = create<AudioPlayerStore>(() => {\r\n const audioRefs: Record<string, HTMLAudioElement> = {};\r\n\r\n // Predefined sounds\r\n const sounds: Record<string, string> = {\r\n click: clickSoundUrl,\r\n hover: hoverSoundUrl,\r\n };\r\n\r\n // Initialize audio elements for each sound\r\n for (const [key, src] of Object.entries(sounds)) {\r\n audioRefs[key] = new Audio(src);\r\n }\r\n\r\n return {\r\n play: (sound) => {\r\n const audio = audioRefs[sound];\r\n if (!audio) return console.warn(`Sound '${sound}' not found.`);\r\n audio.currentTime = 0;\r\n audio.volume = 0.1;\r\n audio.play();\r\n },\r\n stop: (sound) => {\r\n const audio = audioRefs[sound];\r\n if (!audio) return console.warn(`Sound '${sound}' not found.`);\r\n audio.pause();\r\n audio.currentTime = 0;\r\n },\r\n };\r\n});\r\n","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 { 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","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport React, { createContext, useContext, useMemo, useRef } from \"react\";\r\nimport { createStore, StoreApi, useStore } from \"zustand\";\r\n\r\n/* ======================================================\r\n Type Utilities\r\n====================================================== */\r\n\r\ntype PathValue<T, P extends string> = P extends keyof T\r\n ? T[P]\r\n : P extends `${infer K}.${infer R}`\r\n ? K extends keyof T\r\n ? PathValue<T[K], R>\r\n : never\r\n : never;\r\n\r\ntype Paths<T> = T extends object\r\n ? {\r\n [K in keyof T]: K extends string\r\n ? T[K] extends object\r\n ? T[K] extends any[] | Date | Function\r\n ? K\r\n : K | `${K}.${Paths<T[K]>}`\r\n : K\r\n : never;\r\n }[keyof T]\r\n : never;\r\n\r\ntype LoosePaths<T> = Paths<T> | (string & {});\r\n\r\n/* ======================================================\r\n Utilities\r\n====================================================== */\r\n\r\nfunction getNested(obj: any, path: string): any {\r\n return path.split(\".\").reduce((acc, key) => (acc ? acc[key] : undefined), obj);\r\n}\r\n\r\nfunction setNested(obj: any, path: string, value: any): any {\r\n const keys = path.split(\".\");\r\n const root = Array.isArray(obj) ? [...obj] : { ...obj };\r\n let current = root;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n const nextKey = keys[i + 1];\r\n const isIndex = !isNaN(Number(nextKey));\r\n\r\n const existing = current[key];\r\n\r\n current[key] =\r\n existing != null\r\n ? Array.isArray(existing)\r\n ? [...existing]\r\n : { ...existing }\r\n : isIndex\r\n ? []\r\n : {};\r\n\r\n current = current[key];\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n return root;\r\n}\r\n\r\nfunction deleteNested(obj: any, path: string): any {\r\n const keys = path.split(\".\");\r\n const newObj = { ...obj };\r\n let current = newObj;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!current[key]) return obj;\r\n current[key] = { ...current[key] };\r\n current = current[key];\r\n }\r\n\r\n delete current[keys[keys.length - 1]];\r\n return newObj;\r\n}\r\n\r\nfunction isPlainObject(value: any): value is Record<string, any> {\r\n return (\r\n value !== null &&\r\n typeof value === \"object\" &&\r\n !Array.isArray(value) &&\r\n !(value instanceof Date)\r\n );\r\n}\r\n\r\nfunction collectChangedPaths(values: any, initial: any, prefix = \"\"): string[] {\r\n if (Object.is(values, initial)) return [];\r\n\r\n const valuesIsObj = isPlainObject(values);\r\n const initialIsObj = isPlainObject(initial);\r\n const valuesIsArr = Array.isArray(values);\r\n const initialIsArr = Array.isArray(initial);\r\n\r\n if (valuesIsArr || initialIsArr) {\r\n const maxLen = Math.max(values?.length ?? 0, initial?.length ?? 0);\r\n const fields: string[] = [];\r\n for (let i = 0; i < maxLen; i++) {\r\n const nextPrefix = prefix ? `${prefix}.${i}` : `${i}`;\r\n fields.push(...collectChangedPaths(values?.[i], initial?.[i], nextPrefix));\r\n }\r\n return fields;\r\n }\r\n\r\n if (valuesIsObj || initialIsObj) {\r\n const keys = new Set([\r\n ...Object.keys(values ?? {}),\r\n ...Object.keys(initial ?? {}),\r\n ]);\r\n const fields: string[] = [];\r\n for (const key of keys) {\r\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\r\n fields.push(...collectChangedPaths(values?.[key], initial?.[key], nextPrefix));\r\n }\r\n return fields;\r\n }\r\n\r\n return prefix ? [prefix] : [];\r\n}\r\n\r\nfunction computeChangedState<T>(\r\n values: Partial<T>,\r\n initialVals: Partial<T>\r\n): { fields: string[]; partial: Partial<T> } {\r\n const fields = collectChangedPaths(values, initialVals);\r\n let partial: Partial<T> = {};\r\n\r\n for (const path of fields) {\r\n partial = setNested(partial, path, getNested(values, path));\r\n }\r\n\r\n return { fields, partial };\r\n}\r\n\r\nfunction flattenRules(\r\n rules: any,\r\n prefix = \"\"\r\n): Record<string, ValidatorFn> {\r\n const result: Record<string, ValidatorFn> = {};\r\n\r\n for (const key in rules) {\r\n const fullPath = prefix ? `${prefix}.${key}` : key;\r\n const val = rules[key];\r\n\r\n if (typeof val === \"function\") result[fullPath] = val;\r\n else if (typeof val === \"object\")\r\n Object.assign(result, flattenRules(val, fullPath));\r\n }\r\n\r\n return result;\r\n}\r\n\r\nasync function runRule(\r\n rule: ValidatorFn,\r\n value: any,\r\n values: any\r\n): Promise<string | null> {\r\n const result = rule(value, values);\r\n return result instanceof Promise ? await result : result;\r\n}\r\n\r\n/* ======================================================\r\n Types\r\n====================================================== */\r\n\r\nexport type ValidatorFn<T = any> =\r\n | ((value: any, values: Partial<T>) => string | null)\r\n | ((value: any, values: Partial<T>) => Promise<string | null>);\r\n\r\nexport type ValidationRules<T> = {\r\n [K in keyof T]?: T[K] extends object\r\n ? ValidationRules<T[K]>\r\n : ValidatorFn<T>;\r\n};\r\n\r\nexport type FormState<T> = {\r\n values: Partial<T>;\r\n initialValues: Partial<T>;\r\n errors: Record<string, string>;\r\n\r\n partialChanged: Partial<T>;\r\n\r\n getInputProps: (path: string) => {\r\n value: any;\r\n error?: string;\r\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n };\r\n\r\n setValue: (path: string, value: any, options?: { validate?: boolean }) => void;\r\n setInitialValues: (newInitialValues: Partial<T>) => void;\r\n\r\n setError: (path: string, message: string) => void;\r\n clearError: (path: string) => void;\r\n\r\n validate: () => Promise<boolean>;\r\n validateField: (path: string) => Promise<boolean>;\r\n\r\n reset: () => void;\r\n reinitialize: (newValues: Partial<T>) => void;\r\n\r\n back: () => void;\r\n forward: () => void;\r\n canBack: boolean;\r\n canForward: boolean;\r\n\r\n changedFields: string[];\r\n changedCount: number;\r\n resetChangeCount: () => void;\r\n\r\n onSubmit?: (form: FormState<T>) => void;\r\n submit: () => Promise<void>;\r\n};\r\n\r\n/* ======================================================\r\n Store\r\n====================================================== */\r\n\r\nexport function createFormStore<T>(\r\n initialValues: Partial<T>,\r\n validationRules?: ValidationRules<T>,\r\n onSubmit?: (form: FormState<T>) => void\r\n) {\r\n const flatRules = validationRules ? flattenRules(validationRules) : {};\r\n\r\n const history: Partial<T>[] = [];\r\n const future: Partial<T>[] = [];\r\n const changed = new Set<string>();\r\n\r\n return createStore<FormState<T>>((set, get) => ({\r\n initialValues,\r\n values: initialValues,\r\n errors: {},\r\n partialChanged: {},\r\n canBack: false,\r\n canForward: false,\r\n changedFields: [],\r\n changedCount: 0,\r\n onSubmit,\r\n\r\n submit: async () => {\r\n const state = get();\r\n const isValid = await state.validate();\r\n if (isValid && state.onSubmit) {\r\n state.onSubmit(get());\r\n }\r\n },\r\n\r\n getInputProps: (path: string) => {\r\n return {\r\n value: getNested(get().values, path) ?? \"\",\r\n error: get().errors[path],\r\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\r\n get().setValue(path, e.target.value, { validate: true });\r\n },\r\n };\r\n },\r\n\r\n resetChangeCount: () => {\r\n changed.clear();\r\n set({ changedFields: [], changedCount: 0, partialChanged: {} });\r\n },\r\n\r\n setInitialValues: (newInitialValues) =>\r\n set({ initialValues: newInitialValues }),\r\n\r\n setValue: (path, value, options) => {\r\n const state = get();\r\n const currentValues = state.values;\r\n const newValues = setNested(currentValues, path, value);\r\n\r\n const oldValue = getNested(state.initialValues, path);\r\n const hasChanged = value !== oldValue;\r\n\r\n history.push(currentValues);\r\n future.length = 0;\r\n\r\n let newPartial = state.partialChanged;\r\n\r\n if (hasChanged) {\r\n changed.add(path);\r\n newPartial = setNested(newPartial, path, value);\r\n } else {\r\n changed.delete(path);\r\n newPartial = deleteNested(newPartial, path);\r\n }\r\n\r\n set({\r\n values: newValues,\r\n partialChanged: newPartial,\r\n canBack: history.length > 0,\r\n canForward: false,\r\n changedFields: Array.from(changed),\r\n changedCount: changed.size,\r\n });\r\n\r\n if (!options?.validate) return;\r\n\r\n const rule = flatRules[path];\r\n if (!rule) return;\r\n\r\n Promise.resolve(runRule(rule, value, newValues)).then((error) => {\r\n if (error)\r\n set((s) => ({ errors: setNested(s.errors, path, error) }));\r\n else\r\n set((s) => ({ errors: deleteNested(s.errors, path) }));\r\n });\r\n },\r\n\r\n setError: (path, message) =>\r\n set((s) => ({ errors: setNested(s.errors, path, message) })),\r\n\r\n clearError: (path) =>\r\n set((s) => ({ errors: deleteNested(s.errors, path) })),\r\n\r\n validateField: async (path) => {\r\n const state = get();\r\n const rule = flatRules[path];\r\n if (!rule) return true;\r\n\r\n const value = getNested(state.values, path);\r\n const error = await runRule(rule, value, state.values);\r\n\r\n if (error) {\r\n set((s) => ({ errors: setNested(s.errors, path, error) }));\r\n return false;\r\n }\r\n\r\n set((s) => ({ errors: deleteNested(s.errors, path) }));\r\n return true;\r\n },\r\n\r\n validate: async () => {\r\n const state = get();\r\n let isValid = true;\r\n let newErrors: Record<string, string> = {};\r\n\r\n for (const path in flatRules) {\r\n const rule = flatRules[path];\r\n const value = getNested(state.values, path);\r\n const error = await runRule(rule, value, state.values);\r\n\r\n if (error) {\r\n isValid = false;\r\n newErrors = setNested(newErrors, path, error);\r\n }\r\n }\r\n\r\n set({ errors: newErrors });\r\n return isValid;\r\n },\r\n\r\n reset: () => {\r\n history.length = 0;\r\n future.length = 0;\r\n changed.clear();\r\n\r\n set({\r\n values: get().initialValues,\r\n errors: {},\r\n partialChanged: {},\r\n canBack: false,\r\n canForward: false,\r\n changedFields: [],\r\n changedCount: 0,\r\n });\r\n },\r\n\r\n reinitialize: (newValues) => {\r\n history.length = 0;\r\n future.length = 0;\r\n changed.clear();\r\n\r\n set({\r\n values: newValues,\r\n initialValues: newValues,\r\n errors: {},\r\n partialChanged: {},\r\n canBack: false,\r\n canForward: false,\r\n changedFields: [],\r\n changedCount: 0,\r\n });\r\n },\r\n\r\n back: () => {\r\n if (!history.length) return;\r\n\r\n const prev = history.pop()!;\r\n future.push(get().values);\r\n\r\n const { fields, partial } = computeChangedState(prev, get().initialValues);\r\n\r\n set({\r\n values: prev,\r\n partialChanged: partial,\r\n canBack: history.length > 0,\r\n canForward: true,\r\n changedFields: fields,\r\n changedCount: fields.length,\r\n });\r\n },\r\n\r\n forward: () => {\r\n if (!future.length) return;\r\n\r\n const next = future.pop()!;\r\n history.push(get().values);\r\n\r\n const { fields, partial } = computeChangedState(next, get().initialValues);\r\n\r\n set({\r\n values: next,\r\n partialChanged: partial,\r\n canBack: true,\r\n canForward: future.length > 0,\r\n changedFields: fields,\r\n changedCount: fields.length,\r\n });\r\n },\r\n }));\r\n}\r\n\r\n/* ======================================================\r\n Context + Hook\r\n====================================================== */\r\n\r\nconst FormContext = createContext<StoreApi<FormState<any>> | null>(null);\r\n\r\nexport function FormProvider<T>({\r\n initialValues,\r\n validate,\r\n onSubmit,\r\n children,\r\n}: {\r\n initialValues: Partial<T>;\r\n validate?: ValidationRules<T>;\r\n onSubmit?: (form: FormState<T>) => void;\r\n children: React.ReactNode;\r\n}) {\r\n const storeRef = useRef(\r\n createFormStore<T>(initialValues, validate, onSubmit)\r\n );\r\n\r\n return (\r\n <FormContext.Provider value={storeRef.current}>\r\n {children}\r\n </FormContext.Provider>\r\n );\r\n}\r\n\r\nexport function useForm<T>() {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useForm must be used inside <FormProvider>\");\r\n }\r\n const state = useStore(store) as FormState<T>;\r\n\r\n const changedFields = useMemo(() => {\r\n return collectChangedPaths(state.values, state.initialValues);\r\n }, [state.values, state.initialValues]);\r\n\r\n return { ...state, changedFields, changedCount: changedFields.length } as FormState<T>;\r\n}\r\n\r\nexport function useFormField<T, P extends LoosePaths<T> = LoosePaths<T>>(\r\n path: P\r\n): P extends Paths<T> ? PathValue<T, P> | undefined : any {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormField must be used inside <FormProvider>\");\r\n }\r\n return useStore(store, (s) => getNested(s.values, path));\r\n}\r\n\r\nexport function useFormFields<T, P extends LoosePaths<T> = LoosePaths<T>>(\r\n ...paths: P[]\r\n): { [K in P]: K extends Paths<T> ? PathValue<T, K> | undefined : any } {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormFields must be used inside <FormProvider>\");\r\n }\r\n \r\n return useStore(store, (s) => {\r\n const result = {} as { [K in P]: K extends Paths<T> ? PathValue<T, K> | undefined : any };\r\n for (const path of paths) {\r\n result[path] = getNested(s.values, path);\r\n }\r\n return result;\r\n });\r\n}\r\n\r\nexport function useFormError(path: string) {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormError must be used inside <FormProvider>\");\r\n }\r\n return useStore(store, (s) => s.errors[path]);\r\n}\r\n\r\nexport function useFormErrors(...paths: string[]) {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormErrors must be used inside <FormProvider>\");\r\n }\r\n return useStore(store, (s) => {\r\n const result: Record<string, string | undefined> = {};\r\n for (const path of paths) {\r\n result[path] = s.errors[path];\r\n }\r\n return result;\r\n });\r\n}\r\n\r\nexport function useFormActions<T>() {\r\n const store = useContext(FormContext);\r\n if (!store) {\r\n throw new Error(\"useFormActions must be used inside <FormProvider>\");\r\n }\r\n return store.getState() as Pick<\r\n FormState<T>,\r\n | \"setValue\"\r\n | \"setError\"\r\n | \"clearError\"\r\n | \"validate\"\r\n | \"validateField\"\r\n | \"reset\"\r\n | \"reinitialize\"\r\n | \"back\"\r\n | \"forward\"\r\n | \"canBack\"\r\n | \"canForward\"\r\n | \"submit\"\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 resourceVersion?: string;\r\n customTheme?: MantineColorsTuple;\r\n overideResourceName?: string;\r\n serverName?: string;\r\n logo?: string;\r\n language?: 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 resourceVersion: \"dev\",\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 { useSettings } from \"@/utils/useSettings\";\r\nexport function useTornEdges() {\r\n const game = useSettings((state) => state.game);\r\n return game === \"rdr3\" ? \"torn-edge-wrapper\" : \"\";\r\n}\r\n\r\n// Add this SVG to your layout/root component:\r\nexport function TornEdgeSVGFilter() {\r\n return (\r\n <svg\r\n style={{ position: \"absolute\", width: 0, height: 0, pointerEvents: \"none\" }}\r\n aria-hidden=\"true\"\r\n >\r\n <defs>\r\n <filter id=\"torn-edge-filter\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\r\n {/* Base fractal noise for tearing */}\r\n <feTurbulence\r\n type=\"fractalNoise\"\r\n baseFrequency=\"0.018 0.022\"\r\n numOctaves=\"5\"\r\n seed=\"9\"\r\n result=\"noise1\"\r\n />\r\n {/* Second noise layer for micro detail */}\r\n <feTurbulence\r\n type=\"fractalNoise\"\r\n baseFrequency=\"0.08 0.12\"\r\n numOctaves=\"2\"\r\n seed=\"3\"\r\n result=\"noise2\"\r\n />\r\n\r\n {/* Blend both noise layers */}\r\n <feBlend in=\"noise1\" in2=\"noise2\" mode=\"multiply\" result=\"combinedNoise\" />\r\n\r\n {/* Primary displacement */}\r\n <feDisplacementMap\r\n in=\"SourceGraphic\"\r\n in2=\"combinedNoise\"\r\n scale=\"52\"\r\n xChannelSelector=\"R\"\r\n yChannelSelector=\"G\"\r\n result=\"displaced\"\r\n />\r\n\r\n {/* Alpha fade toward edges */}\r\n <feGaussianBlur stdDeviation=\"0.8\" in=\"displaced\" result=\"blurred\" />\r\n <feComponentTransfer in=\"blurred\" result=\"alphaFade\">\r\n <feFuncA type=\"gamma\" amplitude=\"1\" exponent=\"1.3\" offset=\"-0.05\" />\r\n </feComponentTransfer>\r\n\r\n {/* Sharpen a bit after fade */}\r\n <feMorphology operator=\"erode\" radius=\"0.4\" in=\"alphaFade\" result=\"eroded\" />\r\n\r\n {/* Merge final */}\r\n <feMerge>\r\n <feMergeNode in=\"eroded\" />\r\n </feMerge>\r\n </filter>\r\n </defs>\r\n </svg>\r\n );\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 try {\r\n const resp = await fetch(`https://${resourceName}/${eventName}`, options);\r\n return await resp.json();\r\n } catch {\r\n return (mockData ?? ({} as T));\r\n }\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 runFetches().catch(() => {});\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 { fetchNui } from \"@/utils\";\nimport { useNuiEvent } from \"@/hooks/useNuiEvent\";\nimport { create } from \"zustand\";\n\ntype ScriptConfigUpdateMeta<T> = {\n client_version?: number;\n latestVersion?: number;\n latestData?: Partial<T>;\n changed_paths?: Array<{ path: string; old: unknown; new: unknown }>;\n lastEditor?: { source?: number; name?: string; identifier?: string };\n};\n\nexport type ScriptConfigHistoryChange = {\n path: string;\n old: unknown;\n new: unknown;\n};\n\nexport type ScriptConfigHistoryEntry = {\n at_unix: number;\n at_utc: string;\n script: string;\n admin?: { source?: number; name?: string; identifier?: string };\n expected_version?: number;\n applied_version?: number;\n changes: ScriptConfigHistoryChange[];\n};\n\nexport type ScriptConfigHistoryRequest = {\n offset?: number;\n limit?: number;\n query?: string;\n path?: string;\n admin?: string;\n fromUnix?: number;\n toUnix?: number;\n};\n\nexport type ScriptConfigHistoryResponse = {\n success: boolean;\n _error?: string;\n data?: {\n items: ScriptConfigHistoryEntry[];\n total: number;\n limit: number;\n offset: number;\n nextOffset?: number;\n };\n};\n\ntype NuiResponse<T> = {\n success: boolean;\n message?: string;\n _error?: string;\n meta?: ScriptConfigUpdateMeta<T>;\n};\n\n// ── Singleton registry ────────────────────────────────────────────────────────\n\nexport interface ScriptConfigInstance<T = any> {\n store: { getState: () => T; setState: (partial: Partial<T> | ((prev: T) => T)) => void };\n updateConfig: (newConfig: Partial<T>) => Promise<NuiResponse<T>>;\n resetConfig: () => Promise<{ success: boolean; _error?: string }>;\n getHistory: (params?: ScriptConfigHistoryRequest) => Promise<ScriptConfigHistoryResponse>;\n fetchConfig: () => Promise<T | null>;\n}\n\nlet _instance: ScriptConfigInstance | null = null;\n\nexport function getScriptConfigInstance<T = any>(): ScriptConfigInstance<T> {\n if (!_instance) throw new Error(\"[dirk-cfx-react] createScriptConfig must be called before using ConfigPanel\");\n return _instance as ScriptConfigInstance<T>;\n}\n\nexport function createScriptConfig<T>(defaultValue: T) {\n const store = create<T>(() => defaultValue);\n let clientVersion = 0;\n\n const useScriptConfigHooks = () => {\n useNuiEvent<{ config?: Partial<T>; clientVersion?: number }>(\"UPDATE_SCRIPT_CONFIG\", (data) => {\n if (!data) return;\n\n if (typeof data.clientVersion === \"number\") {\n clientVersion = data.clientVersion as number;\n }\n\n if (data.config && typeof data.config === \"object\") {\n store.setState((prev) => ({ ...prev, ...(data.config as Partial<T>) }));\n }\n });\n };\n\n const fetchScriptConfig = async (): Promise<T | null> => {\n try {\n const response = await fetchNui<{\n success: boolean;\n data?: { config: T; clientVersion: number };\n }>(\"GET_FULL_SCRIPT_CONFIG\");\n\n if (response?.success && response.data?.config) {\n store.setState(() => response.data!.config as T);\n if (typeof response.data.clientVersion === \"number\") {\n clientVersion = response.data.clientVersion;\n }\n return response.data.config;\n }\n } catch { /* fallback to current store state */ }\n return null;\n };\n\n const updateScriptConfig = async (newConfig: Partial<T>): Promise<NuiResponse<T>> => {\n store.setState((prev) => ({ ...prev, ...newConfig }));\n\n const response = await fetchNui<NuiResponse<T>>(\"UPDATE_SCRIPT_CONFIG\", {\n data: newConfig,\n expectedVersion: clientVersion,\n });\n\n if (response?.meta?.client_version != null) {\n clientVersion = response.meta.client_version as number;\n }\n\n if (response?.success === false && response?.meta?.latestData) {\n store.setState((prev) => ({ ...prev, ...(response.meta!.latestData as Partial<T>) }));\n }\n\n return response;\n };\n\n const getScriptConfigHistory = async (\n params: ScriptConfigHistoryRequest = {}\n ): Promise<ScriptConfigHistoryResponse> => {\n return fetchNui<ScriptConfigHistoryResponse>('GET_SCRIPT_CONFIG_HISTORY', params);\n };\n\n const resetConfig = async (): Promise<{ success: boolean; _error?: string }> => {\n const response = await fetchNui<{ success: boolean; _error?: string }>('RESET_SCRIPT_CONFIG');\n if (response?.success) {\n const fresh = await fetchScriptConfig();\n if (fresh) {\n store.setState(() => fresh);\n }\n }\n return response;\n };\n\n _instance = {\n store,\n updateConfig: updateScriptConfig,\n resetConfig,\n getHistory: getScriptConfigHistory,\n fetchConfig: fetchScriptConfig,\n };\n\n return {store, updateScriptConfig, resetConfig, getScriptConfigHistory, useScriptConfigHooks, fetchScriptConfig}\n}\n"]}
@@ -85,7 +85,7 @@ declare function useFormActions<T>(): Pick<FormState<T>, "setValue" | "setError"
85
85
  declare function useTornEdges(): "" | "torn-edge-wrapper";
86
86
  declare function TornEdgeSVGFilter(): react_jsx_runtime.JSX.Element;
87
87
 
88
- type ScriptSettingsUpdateMeta<T> = {
88
+ type ScriptConfigUpdateMeta<T> = {
89
89
  client_version?: number;
90
90
  latestVersion?: number;
91
91
  latestData?: Partial<T>;
@@ -100,12 +100,12 @@ type ScriptSettingsUpdateMeta<T> = {
100
100
  identifier?: string;
101
101
  };
102
102
  };
103
- type ScriptSettingsHistoryChange = {
103
+ type ScriptConfigHistoryChange = {
104
104
  path: string;
105
105
  old: unknown;
106
106
  new: unknown;
107
107
  };
108
- type ScriptSettingsHistoryEntry = {
108
+ type ScriptConfigHistoryEntry = {
109
109
  at_unix: number;
110
110
  at_utc: string;
111
111
  script: string;
@@ -116,9 +116,9 @@ type ScriptSettingsHistoryEntry = {
116
116
  };
117
117
  expected_version?: number;
118
118
  applied_version?: number;
119
- changes: ScriptSettingsHistoryChange[];
119
+ changes: ScriptConfigHistoryChange[];
120
120
  };
121
- type ScriptSettingsHistoryRequest = {
121
+ type ScriptConfigHistoryRequest = {
122
122
  offset?: number;
123
123
  limit?: number;
124
124
  query?: string;
@@ -127,11 +127,11 @@ type ScriptSettingsHistoryRequest = {
127
127
  fromUnix?: number;
128
128
  toUnix?: number;
129
129
  };
130
- type ScriptSettingsHistoryResponse = {
130
+ type ScriptConfigHistoryResponse = {
131
131
  success: boolean;
132
132
  _error?: string;
133
133
  data?: {
134
- items: ScriptSettingsHistoryEntry[];
134
+ items: ScriptConfigHistoryEntry[];
135
135
  total: number;
136
136
  limit: number;
137
137
  offset: number;
@@ -142,24 +142,32 @@ type NuiResponse<T> = {
142
142
  success: boolean;
143
143
  message?: string;
144
144
  _error?: string;
145
- meta?: ScriptSettingsUpdateMeta<T>;
145
+ meta?: ScriptConfigUpdateMeta<T>;
146
146
  };
147
- interface ScriptSettingsInstance<T = any> {
147
+ interface ScriptConfigInstance<T = any> {
148
148
  store: {
149
149
  getState: () => T;
150
150
  setState: (partial: Partial<T> | ((prev: T) => T)) => void;
151
151
  };
152
- updateSettings: (newSettings: Partial<T>) => Promise<NuiResponse<T>>;
153
- getHistory: (params?: ScriptSettingsHistoryRequest) => Promise<ScriptSettingsHistoryResponse>;
154
- fetchSettings: () => Promise<T | null>;
152
+ updateConfig: (newConfig: Partial<T>) => Promise<NuiResponse<T>>;
153
+ resetConfig: () => Promise<{
154
+ success: boolean;
155
+ _error?: string;
156
+ }>;
157
+ getHistory: (params?: ScriptConfigHistoryRequest) => Promise<ScriptConfigHistoryResponse>;
158
+ fetchConfig: () => Promise<T | null>;
155
159
  }
156
- declare function getScriptSettingsInstance<T = any>(): ScriptSettingsInstance<T>;
157
- declare function createScriptSettings<T>(defaultValue: T): {
160
+ declare function getScriptConfigInstance<T = any>(): ScriptConfigInstance<T>;
161
+ declare function createScriptConfig<T>(defaultValue: T): {
158
162
  store: zustand.UseBoundStore<zustand.StoreApi<T>>;
159
- updateScriptSettings: (newSettings: Partial<T>) => Promise<NuiResponse<T>>;
160
- getScriptSettingsHistory: (params?: ScriptSettingsHistoryRequest) => Promise<ScriptSettingsHistoryResponse>;
161
- useScriptSettingHooks: () => void;
162
- fetchScriptSettings: () => Promise<T | null>;
163
+ updateScriptConfig: (newConfig: Partial<T>) => Promise<NuiResponse<T>>;
164
+ resetConfig: () => Promise<{
165
+ success: boolean;
166
+ _error?: string;
167
+ }>;
168
+ getScriptConfigHistory: (params?: ScriptConfigHistoryRequest) => Promise<ScriptConfigHistoryResponse>;
169
+ useScriptConfigHooks: () => void;
170
+ fetchScriptConfig: () => Promise<T | null>;
163
171
  };
164
172
 
165
- export { FormProvider, type FormState, type NuiHandlerSignature, type NuiMessageData, type ScriptSettingsHistoryChange, type ScriptSettingsHistoryEntry, type ScriptSettingsHistoryRequest, type ScriptSettingsHistoryResponse, type ScriptSettingsInstance, TornEdgeSVGFilter, type ValidationRules, type ValidatorFn, createFormStore, createScriptSettings, getScriptSettingsInstance, useAudio, useForm, useFormActions, useFormError, useFormErrors, useFormField, useFormFields, useNuiEvent, useTornEdges };
173
+ export { FormProvider, type FormState, type NuiHandlerSignature, type NuiMessageData, type ScriptConfigHistoryChange, type ScriptConfigHistoryEntry, type ScriptConfigHistoryRequest, type ScriptConfigHistoryResponse, type ScriptConfigInstance, TornEdgeSVGFilter, type ValidationRules, type ValidatorFn, createFormStore, createScriptConfig, getScriptConfigInstance, useAudio, useForm, useFormActions, useFormError, useFormErrors, useFormField, useFormFields, useNuiEvent, useTornEdges };
@@ -85,7 +85,7 @@ declare function useFormActions<T>(): Pick<FormState<T>, "setValue" | "setError"
85
85
  declare function useTornEdges(): "" | "torn-edge-wrapper";
86
86
  declare function TornEdgeSVGFilter(): react_jsx_runtime.JSX.Element;
87
87
 
88
- type ScriptSettingsUpdateMeta<T> = {
88
+ type ScriptConfigUpdateMeta<T> = {
89
89
  client_version?: number;
90
90
  latestVersion?: number;
91
91
  latestData?: Partial<T>;
@@ -100,12 +100,12 @@ type ScriptSettingsUpdateMeta<T> = {
100
100
  identifier?: string;
101
101
  };
102
102
  };
103
- type ScriptSettingsHistoryChange = {
103
+ type ScriptConfigHistoryChange = {
104
104
  path: string;
105
105
  old: unknown;
106
106
  new: unknown;
107
107
  };
108
- type ScriptSettingsHistoryEntry = {
108
+ type ScriptConfigHistoryEntry = {
109
109
  at_unix: number;
110
110
  at_utc: string;
111
111
  script: string;
@@ -116,9 +116,9 @@ type ScriptSettingsHistoryEntry = {
116
116
  };
117
117
  expected_version?: number;
118
118
  applied_version?: number;
119
- changes: ScriptSettingsHistoryChange[];
119
+ changes: ScriptConfigHistoryChange[];
120
120
  };
121
- type ScriptSettingsHistoryRequest = {
121
+ type ScriptConfigHistoryRequest = {
122
122
  offset?: number;
123
123
  limit?: number;
124
124
  query?: string;
@@ -127,11 +127,11 @@ type ScriptSettingsHistoryRequest = {
127
127
  fromUnix?: number;
128
128
  toUnix?: number;
129
129
  };
130
- type ScriptSettingsHistoryResponse = {
130
+ type ScriptConfigHistoryResponse = {
131
131
  success: boolean;
132
132
  _error?: string;
133
133
  data?: {
134
- items: ScriptSettingsHistoryEntry[];
134
+ items: ScriptConfigHistoryEntry[];
135
135
  total: number;
136
136
  limit: number;
137
137
  offset: number;
@@ -142,24 +142,32 @@ type NuiResponse<T> = {
142
142
  success: boolean;
143
143
  message?: string;
144
144
  _error?: string;
145
- meta?: ScriptSettingsUpdateMeta<T>;
145
+ meta?: ScriptConfigUpdateMeta<T>;
146
146
  };
147
- interface ScriptSettingsInstance<T = any> {
147
+ interface ScriptConfigInstance<T = any> {
148
148
  store: {
149
149
  getState: () => T;
150
150
  setState: (partial: Partial<T> | ((prev: T) => T)) => void;
151
151
  };
152
- updateSettings: (newSettings: Partial<T>) => Promise<NuiResponse<T>>;
153
- getHistory: (params?: ScriptSettingsHistoryRequest) => Promise<ScriptSettingsHistoryResponse>;
154
- fetchSettings: () => Promise<T | null>;
152
+ updateConfig: (newConfig: Partial<T>) => Promise<NuiResponse<T>>;
153
+ resetConfig: () => Promise<{
154
+ success: boolean;
155
+ _error?: string;
156
+ }>;
157
+ getHistory: (params?: ScriptConfigHistoryRequest) => Promise<ScriptConfigHistoryResponse>;
158
+ fetchConfig: () => Promise<T | null>;
155
159
  }
156
- declare function getScriptSettingsInstance<T = any>(): ScriptSettingsInstance<T>;
157
- declare function createScriptSettings<T>(defaultValue: T): {
160
+ declare function getScriptConfigInstance<T = any>(): ScriptConfigInstance<T>;
161
+ declare function createScriptConfig<T>(defaultValue: T): {
158
162
  store: zustand.UseBoundStore<zustand.StoreApi<T>>;
159
- updateScriptSettings: (newSettings: Partial<T>) => Promise<NuiResponse<T>>;
160
- getScriptSettingsHistory: (params?: ScriptSettingsHistoryRequest) => Promise<ScriptSettingsHistoryResponse>;
161
- useScriptSettingHooks: () => void;
162
- fetchScriptSettings: () => Promise<T | null>;
163
+ updateScriptConfig: (newConfig: Partial<T>) => Promise<NuiResponse<T>>;
164
+ resetConfig: () => Promise<{
165
+ success: boolean;
166
+ _error?: string;
167
+ }>;
168
+ getScriptConfigHistory: (params?: ScriptConfigHistoryRequest) => Promise<ScriptConfigHistoryResponse>;
169
+ useScriptConfigHooks: () => void;
170
+ fetchScriptConfig: () => Promise<T | null>;
163
171
  };
164
172
 
165
- export { FormProvider, type FormState, type NuiHandlerSignature, type NuiMessageData, type ScriptSettingsHistoryChange, type ScriptSettingsHistoryEntry, type ScriptSettingsHistoryRequest, type ScriptSettingsHistoryResponse, type ScriptSettingsInstance, TornEdgeSVGFilter, type ValidationRules, type ValidatorFn, createFormStore, createScriptSettings, getScriptSettingsInstance, useAudio, useForm, useFormActions, useFormError, useFormErrors, useFormField, useFormFields, useNuiEvent, useTornEdges };
173
+ export { FormProvider, type FormState, type NuiHandlerSignature, type NuiMessageData, type ScriptConfigHistoryChange, type ScriptConfigHistoryEntry, type ScriptConfigHistoryRequest, type ScriptConfigHistoryResponse, type ScriptConfigInstance, TornEdgeSVGFilter, type ValidationRules, type ValidatorFn, createFormStore, createScriptConfig, getScriptConfigInstance, useAudio, useForm, useFormActions, useFormError, useFormErrors, useFormField, useFormFields, useNuiEvent, useTornEdges };