dirk-cfx-react 1.1.10 → 1.1.11

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/misc.ts","../../src/hooks/useNuiEvent.ts","../../src/hooks/useForm.tsx","../../src/utils/fetchNui.ts","../../src/utils/useSettings.ts","../../src/hooks/useTornEdges.tsx","../../src/hooks/useScriptSettings.ts"],"names":["state","useRef","jsx","create"],"mappings":"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","file":"index.js","sourcesContent":["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, useRef } from \"react\";\r\nimport { createStore, StoreApi, useStore } from \"zustand\";\r\n\r\n// ---- Utility functions ----\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 newObj = { ...obj };\r\n let current = newObj;\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n current[key] = { ...(current[key] || {}) };\r\n current = current[key];\r\n }\r\n current[keys[keys.length - 1]] = value;\r\n return newObj;\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 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 delete current[keys[keys.length - 1]];\r\n return newObj;\r\n}\r\n\r\nfunction flattenRules(\r\n rules: any,\r\n prefix = \"\"\r\n): Record<string, (value: any, values: any) => string | null> {\r\n const result: Record<string, (value: any, values: any) => string | null> = {};\r\n for (const key in rules) {\r\n const fullPath = prefix ? `${prefix}.${key}` : key;\r\n const val = rules[key];\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 return result;\r\n}\r\n\r\n// ---- Types ----\r\nexport type ValidationRules<T> = {\r\n [K in keyof T]?: T[K] extends object\r\n ? ValidationRules<T[K]>\r\n : (value: T[K], values: Partial<T>) => string | null;\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 setValue: (path: string, value: any) => void;\r\n setInitialValues: (newInitialValues: Partial<T>) => void;\r\n setError: (path: string, message: string) => void;\r\n clearError: (path: string) => void;\r\n validate: () => boolean;\r\n validateField: (path: string) => boolean;\r\n reset: () => 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 /** New additions **/\r\n onSubmit?: (form: FormState<T>) => void;\r\n submit: () => void;\r\n};\r\n\r\n// ---- Core Store ----\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 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 canBack: false,\r\n canForward: false,\r\n changedFields: [],\r\n changedCount: 0,\r\n onSubmit,\r\n submit: () => {\r\n const state = get();\r\n const isValid = state.validate();\r\n if (isValid && state.onSubmit) state.onSubmit(get());\r\n },\r\n\r\n resetChangeCount: () => {\r\n changed.clear();\r\n set(() => ({\r\n changedFields: [],\r\n changedCount: 0,\r\n }));\r\n },\r\n\r\n setInitialValues: (newInitialValues) =>\r\n set({ initialValues: newInitialValues }),\r\n\r\n setValue: (path, value) => {\r\n const currentValues = get().values;\r\n const newValues = setNested(currentValues, path, value);\r\n const oldValue = getNested(get().initialValues, path);\r\n\r\n history.push(currentValues);\r\n future.length = 0;\r\n\r\n if (value !== oldValue) changed.add(path);\r\n else changed.delete(path);\r\n\r\n set({\r\n values: newValues,\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 const rule = flatRules[path];\r\n if (rule) {\r\n const error = rule(value, newValues);\r\n if (error)\r\n set((state) => ({ errors: setNested(state.errors, path, error) }));\r\n else set((state) => ({ errors: deleteNested(state.errors, path) }));\r\n }\r\n },\r\n\r\n setError: (path, message) =>\r\n set((state) => ({ errors: setNested(state.errors, path, message) })),\r\n clearError: (path) =>\r\n set((state) => ({ errors: deleteNested(state.errors, path) })),\r\n\r\n validateField: (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 = rule(value, state.values);\r\n if (error) {\r\n set((state) => ({ errors: setNested(state.errors, path, error) }));\r\n return false;\r\n } else {\r\n set((state) => ({ errors: deleteNested(state.errors, path) }));\r\n return true;\r\n }\r\n },\r\n\r\n validate: () => {\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 = rule(value, state.values);\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 set({\r\n values: initialValues,\r\n errors: {},\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 const state = get();\r\n if (history.length === 0) return;\r\n const prev = history.pop()!;\r\n future.push(state.values);\r\n\r\n changed.clear();\r\n const current = prev;\r\n const initial = get().initialValues;\r\n for (const key in current) {\r\n if (JSON.stringify(current[key]) !== JSON.stringify(initial[key]))\r\n changed.add(key);\r\n }\r\n\r\n set({\r\n values: prev,\r\n canBack: history.length > 0,\r\n canForward: true,\r\n changedFields: Array.from(changed),\r\n changedCount: changed.size,\r\n });\r\n },\r\n\r\n forward: () => {\r\n const state = get();\r\n if (future.length === 0) return;\r\n const next = future.pop()!;\r\n history.push(state.values);\r\n\r\n changed.clear();\r\n const current = next;\r\n const initial = get().initialValues;\r\n for (const key in current) {\r\n if (JSON.stringify(current[key]) !== JSON.stringify(initial[key]))\r\n changed.add(key);\r\n }\r\n\r\n set({\r\n values: next,\r\n canBack: true,\r\n canForward: future.length > 0,\r\n changedFields: Array.from(changed),\r\n changedCount: changed.size,\r\n });\r\n },\r\n }));\r\n}\r\n\r\n// ---- Context ----\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(createFormStore<T>(initialValues, validate, onSubmit));\r\n return (\r\n <FormContext.Provider value={storeRef.current}>\r\n {children}\r\n </FormContext.Provider>\r\n );\r\n}\r\n\r\n// ---- Hook ----\r\nexport function useForm<T>() {\r\n const store = useContext(FormContext);\r\n if (!store) throw new Error(\"useForm must be used inside a <FormProvider>\");\r\n return useStore(store) as FormState<T>;\r\n}\r\n","import { useEffect } from \"react\";\r\nimport { isEnvBrowser } from \"./misc\";\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) 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 resourceName = (window as any).GetParentResourceName\r\n ? (window as any).GetParentResourceName()\r\n : \"nui-frame-app\";\r\n\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","import { create } from \"zustand\";\r\nimport { registerInitialFetch } from \"./fetchNui\";\r\nimport { MantineColorsTuple } from \"@mantine/core\";\r\n\r\nexport type SettingsState = {\r\n game: \"fivem\" | \"rdr3\";\r\n primaryColor: string;\r\n primaryShade: number;\r\n itemImgPath: string;\r\n customTheme?: MantineColorsTuple;\r\n};\r\n\r\nexport const useSettings = create<SettingsState>(() => ({\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\r\nregisterInitialFetch<Partial<SettingsState>>(\"GET_SETTINGS\")\r\n .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","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","\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 { useNuiEvent } from \"@/hooks\";\r\nimport { fetchNui } from \"@/utils\";\r\nimport { create } from \"zustand\";\r\ntype NuiResponse = { success: boolean; message: string };\r\n\r\n// it will basically rturn a zustand store aswell as aset of hooks required to operate/update this store \r\nexport function createScriptSettings<T>(defaultValue: T) {\r\n const store = create<T>(() => defaultValue);\r\n\r\n const useScriptSettingHooks = () => {\r\n useNuiEvent<Partial<T>>(\"UPDATE_SCRIPT_SETTINGS\", (newSettings) => {\r\n store.setState((prev) => ({ ...prev, ...newSettings }));\r\n });\r\n };\r\n\r\n // below returns {success, message} from the nui event\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"]}
1
+ {"version":3,"sources":["../../src/utils/misc.ts","../../src/hooks/useNuiEvent.ts","../../src/hooks/useForm.tsx","../../src/utils/fetchNui.ts","../../src/utils/useSettings.ts","../../src/hooks/useTornEdges.tsx","../../src/hooks/useScriptSettings.ts"],"names":["useRef","jsx","create"],"mappings":"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","file":"index.js","sourcesContent":["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, useRef } from \"react\";\r\nimport { createStore, StoreApi, useStore } from \"zustand\";\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 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 current[key] = { ...(current[key] || {}) };\r\n current = current[key];\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n return newObj;\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 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 setValue: (path: string, value: any) => 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\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 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 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 resetChangeCount: () => {\r\n changed.clear();\r\n set({ changedFields: [], changedCount: 0 });\r\n },\r\n\r\n setInitialValues: (newInitialValues) =>\r\n set({ initialValues: newInitialValues }),\r\n\r\n setValue: (path, value) => {\r\n const currentValues = get().values;\r\n const newValues = setNested(currentValues, path, value);\r\n const oldValue = getNested(get().initialValues, path);\r\n\r\n history.push(currentValues);\r\n future.length = 0;\r\n\r\n if (value !== oldValue) changed.add(path);\r\n else changed.delete(path);\r\n\r\n set({\r\n values: newValues,\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 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: initialValues,\r\n errors: {},\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 changed.clear();\r\n const initial = get().initialValues;\r\n\r\n for (const key in prev) {\r\n if (JSON.stringify(prev[key]) !== JSON.stringify(initial[key]))\r\n changed.add(key);\r\n }\r\n\r\n set({\r\n values: prev,\r\n canBack: history.length > 0,\r\n canForward: true,\r\n changedFields: Array.from(changed),\r\n changedCount: changed.size,\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 changed.clear();\r\n const initial = get().initialValues;\r\n\r\n for (const key in next) {\r\n if (JSON.stringify(next[key]) !== JSON.stringify(initial[key]))\r\n changed.add(key);\r\n }\r\n\r\n set({\r\n values: next,\r\n canBack: true,\r\n canForward: future.length > 0,\r\n changedFields: Array.from(changed),\r\n changedCount: changed.size,\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 return useStore(store) as FormState<T>;\r\n}\r\n","import { useEffect } from \"react\";\r\nimport { isEnvBrowser } from \"./misc\";\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) 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 resourceName = (window as any).GetParentResourceName\r\n ? (window as any).GetParentResourceName()\r\n : \"nui-frame-app\";\r\n\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","import { create } from \"zustand\";\r\nimport { registerInitialFetch } from \"./fetchNui\";\r\nimport { MantineColorsTuple } from \"@mantine/core\";\r\n\r\nexport type SettingsState = {\r\n game: \"fivem\" | \"rdr3\";\r\n primaryColor: string;\r\n primaryShade: number;\r\n itemImgPath: string;\r\n customTheme?: MantineColorsTuple;\r\n};\r\n\r\nexport const useSettings = create<SettingsState>(() => ({\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\r\nregisterInitialFetch<Partial<SettingsState>>(\"GET_SETTINGS\")\r\n .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","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","\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 { useNuiEvent } from \"@/hooks\";\r\nimport { fetchNui } from \"@/utils\";\r\nimport { create } from \"zustand\";\r\ntype NuiResponse = { success: boolean; message: string };\r\n\r\n// it will basically rturn a zustand store aswell as aset of hooks required to operate/update this store \r\nexport function createScriptSettings<T>(defaultValue: T) {\r\n const store = create<T>(() => defaultValue);\r\n\r\n const useScriptSettingHooks = () => {\r\n useNuiEvent<Partial<T>>(\"UPDATE_SCRIPT_SETTINGS\", (newSettings) => {\r\n store.setState((prev) => ({ ...prev, ...newSettings }));\r\n });\r\n };\r\n\r\n // below returns {success, message} from the nui event\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"]}
package/dist/index.cjs CHANGED
@@ -2021,6 +2021,10 @@ function flattenRules(rules, prefix = "") {
2021
2021
  }
2022
2022
  return result;
2023
2023
  }
2024
+ async function runRule(rule, value, values) {
2025
+ const result = rule(value, values);
2026
+ return result instanceof Promise ? await result : result;
2027
+ }
2024
2028
  function createFormStore(initialValues, validationRules, onSubmit) {
2025
2029
  const flatRules = validationRules ? flattenRules(validationRules) : {};
2026
2030
  const history = [];
@@ -2035,17 +2039,16 @@ function createFormStore(initialValues, validationRules, onSubmit) {
2035
2039
  changedFields: [],
2036
2040
  changedCount: 0,
2037
2041
  onSubmit,
2038
- submit: () => {
2042
+ submit: async () => {
2039
2043
  const state = get();
2040
- const isValid = state.validate();
2041
- if (isValid && state.onSubmit) state.onSubmit(get());
2044
+ const isValid = await state.validate();
2045
+ if (isValid && state.onSubmit) {
2046
+ state.onSubmit(get());
2047
+ }
2042
2048
  },
2043
2049
  resetChangeCount: () => {
2044
2050
  changed.clear();
2045
- set(() => ({
2046
- changedFields: [],
2047
- changedCount: 0
2048
- }));
2051
+ set({ changedFields: [], changedCount: 0 });
2049
2052
  },
2050
2053
  setInitialValues: (newInitialValues) => set({ initialValues: newInitialValues }),
2051
2054
  setValue: (path, value) => {
@@ -2064,37 +2067,37 @@ function createFormStore(initialValues, validationRules, onSubmit) {
2064
2067
  changedCount: changed.size
2065
2068
  });
2066
2069
  const rule = flatRules[path];
2067
- if (rule) {
2068
- const error2 = rule(value, newValues);
2070
+ if (!rule) return;
2071
+ Promise.resolve(runRule(rule, value, newValues)).then((error2) => {
2069
2072
  if (error2)
2070
- set((state) => ({ errors: setNested(state.errors, path, error2) }));
2071
- else set((state) => ({ errors: deleteNested(state.errors, path) }));
2072
- }
2073
+ set((s) => ({ errors: setNested(s.errors, path, error2) }));
2074
+ else
2075
+ set((s) => ({ errors: deleteNested(s.errors, path) }));
2076
+ });
2073
2077
  },
2074
- setError: (path, message) => set((state) => ({ errors: setNested(state.errors, path, message) })),
2075
- clearError: (path) => set((state) => ({ errors: deleteNested(state.errors, path) })),
2076
- validateField: (path) => {
2078
+ setError: (path, message) => set((s) => ({ errors: setNested(s.errors, path, message) })),
2079
+ clearError: (path) => set((s) => ({ errors: deleteNested(s.errors, path) })),
2080
+ validateField: async (path) => {
2077
2081
  const state = get();
2078
2082
  const rule = flatRules[path];
2079
2083
  if (!rule) return true;
2080
2084
  const value = getNested(state.values, path);
2081
- const error2 = rule(value, state.values);
2085
+ const error2 = await runRule(rule, value, state.values);
2082
2086
  if (error2) {
2083
- set((state2) => ({ errors: setNested(state2.errors, path, error2) }));
2087
+ set((s) => ({ errors: setNested(s.errors, path, error2) }));
2084
2088
  return false;
2085
- } else {
2086
- set((state2) => ({ errors: deleteNested(state2.errors, path) }));
2087
- return true;
2088
2089
  }
2090
+ set((s) => ({ errors: deleteNested(s.errors, path) }));
2091
+ return true;
2089
2092
  },
2090
- validate: () => {
2093
+ validate: async () => {
2091
2094
  const state = get();
2092
2095
  let isValid = true;
2093
2096
  let newErrors = {};
2094
2097
  for (const path in flatRules) {
2095
2098
  const rule = flatRules[path];
2096
2099
  const value = getNested(state.values, path);
2097
- const error2 = rule(value, state.values);
2100
+ const error2 = await runRule(rule, value, state.values);
2098
2101
  if (error2) {
2099
2102
  isValid = false;
2100
2103
  newErrors = setNested(newErrors, path, error2);
@@ -2117,15 +2120,13 @@ function createFormStore(initialValues, validationRules, onSubmit) {
2117
2120
  });
2118
2121
  },
2119
2122
  back: () => {
2120
- const state = get();
2121
- if (history.length === 0) return;
2123
+ if (!history.length) return;
2122
2124
  const prev = history.pop();
2123
- future.push(state.values);
2125
+ future.push(get().values);
2124
2126
  changed.clear();
2125
- const current = prev;
2126
2127
  const initial = get().initialValues;
2127
- for (const key in current) {
2128
- if (JSON.stringify(current[key]) !== JSON.stringify(initial[key]))
2128
+ for (const key in prev) {
2129
+ if (JSON.stringify(prev[key]) !== JSON.stringify(initial[key]))
2129
2130
  changed.add(key);
2130
2131
  }
2131
2132
  set({
@@ -2137,15 +2138,13 @@ function createFormStore(initialValues, validationRules, onSubmit) {
2137
2138
  });
2138
2139
  },
2139
2140
  forward: () => {
2140
- const state = get();
2141
- if (future.length === 0) return;
2141
+ if (!future.length) return;
2142
2142
  const next = future.pop();
2143
- history.push(state.values);
2143
+ history.push(get().values);
2144
2144
  changed.clear();
2145
- const current = next;
2146
2145
  const initial = get().initialValues;
2147
- for (const key in current) {
2148
- if (JSON.stringify(current[key]) !== JSON.stringify(initial[key]))
2146
+ for (const key in next) {
2147
+ if (JSON.stringify(next[key]) !== JSON.stringify(initial[key]))
2149
2148
  changed.add(key);
2150
2149
  }
2151
2150
  set({
@@ -2165,12 +2164,16 @@ function FormProvider({
2165
2164
  onSubmit,
2166
2165
  children
2167
2166
  }) {
2168
- const storeRef = React3.useRef(createFormStore(initialValues, validate, onSubmit));
2167
+ const storeRef = React3.useRef(
2168
+ createFormStore(initialValues, validate, onSubmit)
2169
+ );
2169
2170
  return /* @__PURE__ */ jsxRuntime.jsx(FormContext.Provider, { value: storeRef.current, children });
2170
2171
  }
2171
2172
  function useForm() {
2172
2173
  const store = React3.useContext(FormContext);
2173
- if (!store) throw new Error("useForm must be used inside a <FormProvider>");
2174
+ if (!store) {
2175
+ throw new Error("useForm must be used inside <FormProvider>");
2176
+ }
2174
2177
  return zustand.useStore(store);
2175
2178
  }
2176
2179
  function useTornEdges() {