dirk-cfx-react 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/click_sound-PNCRRTM4.mp3 +0 -0
- package/dist/components/index.d.mts +143 -0
- package/dist/components/index.d.ts +143 -0
- package/dist/components/index.js +1020 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +1000 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/hooks/index.d.mts +14 -0
- package/dist/hooks/index.d.ts +14 -0
- package/dist/hooks/index.js +33 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +31 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/hover_sound-NBUA222C.mp3 +0 -0
- package/dist/index.d.mts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +1256 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1220 -0
- package/dist/index.mjs.map +1 -0
- package/dist/providers/index.d.mts +16 -0
- package/dist/providers/index.d.ts +16 -0
- package/dist/providers/index.js +208 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/index.mjs +205 -0
- package/dist/providers/index.mjs.map +1 -0
- package/dist/utils/index.d.mts +61 -0
- package/dist/utils/index.d.ts +61 -0
- package/dist/utils/index.js +283 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +269 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import '@mantine/notifications/styles.css';
|
|
2
|
+
import '@mantine/core/styles.css';
|
|
3
|
+
import '@/styles/niceFont.css';
|
|
4
|
+
import '@/styles/scrollBar.css';
|
|
5
|
+
import { library } from '@fortawesome/fontawesome-svg-core';
|
|
6
|
+
import { fab } from '@fortawesome/free-brands-svg-icons';
|
|
7
|
+
import { far } from '@fortawesome/free-regular-svg-icons';
|
|
8
|
+
import { fas } from '@fortawesome/free-solid-svg-icons';
|
|
9
|
+
import { createTheme, MantineProvider, BackgroundImage } from '@mantine/core';
|
|
10
|
+
import { create } from 'zustand';
|
|
11
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
12
|
+
|
|
13
|
+
// src/providers/DirkProvider.tsx
|
|
14
|
+
|
|
15
|
+
// src/utils/misc.ts
|
|
16
|
+
var isEnvBrowser = () => !window.invokeNative;
|
|
17
|
+
|
|
18
|
+
// src/utils/fetchNui.ts
|
|
19
|
+
async function fetchNui(eventName, data, mockData) {
|
|
20
|
+
const options = {
|
|
21
|
+
method: "post",
|
|
22
|
+
headers: {
|
|
23
|
+
"Content-Type": "application/json; charset=UTF-8"
|
|
24
|
+
},
|
|
25
|
+
body: JSON.stringify(data)
|
|
26
|
+
};
|
|
27
|
+
console.log("Mock Data:", mockData);
|
|
28
|
+
console.log("Is Env Browser:", isEnvBrowser());
|
|
29
|
+
const resourceName = window.GetParentResourceName ? window.GetParentResourceName() : "nui-frame-app";
|
|
30
|
+
const resp = await fetch(`https://${resourceName}/${eventName}`, options);
|
|
31
|
+
const respFormatted = await resp.json();
|
|
32
|
+
return respFormatted;
|
|
33
|
+
}
|
|
34
|
+
function fetchOnLoad(eventName, data, mockData) {
|
|
35
|
+
return fetchNui(eventName, data, mockData).catch((err) => {
|
|
36
|
+
console.error(`[fetchOnLoad] Failed for ${eventName}:`, err);
|
|
37
|
+
throw err;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
var localeStore = create((set, get) => {
|
|
41
|
+
return {
|
|
42
|
+
locales: {
|
|
43
|
+
"OccupantsDesc": "Here you can view and manage the occupants of your traphouse. These occupants can be used mainly for selling drugs to the NPCs surrounding your traphouse. However they have other uses to so be careful who you add as an occupant."
|
|
44
|
+
},
|
|
45
|
+
locale: (key, ...args) => {
|
|
46
|
+
const exists = get().locales[key];
|
|
47
|
+
let translation = exists || key;
|
|
48
|
+
if (args.length) {
|
|
49
|
+
translation = translation.replace(/%s/g, () => String(args.shift() || ""));
|
|
50
|
+
}
|
|
51
|
+
return translation;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
localeStore.getState().locale;
|
|
56
|
+
fetchOnLoad("GET_LOCALES").then((data) => {
|
|
57
|
+
localeStore.setState({ locales: data });
|
|
58
|
+
});
|
|
59
|
+
var theme = createTheme({
|
|
60
|
+
primaryColor: "dirk",
|
|
61
|
+
primaryShade: 9,
|
|
62
|
+
defaultRadius: "xxs",
|
|
63
|
+
fontFamily: "Akrobat Regular, sans-serif",
|
|
64
|
+
radius: {
|
|
65
|
+
xxs: "0.2vh",
|
|
66
|
+
xs: "0.4vh",
|
|
67
|
+
sm: "0.75vh",
|
|
68
|
+
md: "1vh",
|
|
69
|
+
lg: "1.5vh",
|
|
70
|
+
xl: "2vh",
|
|
71
|
+
xxl: "3vh"
|
|
72
|
+
},
|
|
73
|
+
fontSizes: {
|
|
74
|
+
xxs: "1.2vh",
|
|
75
|
+
xs: "1.5vh",
|
|
76
|
+
sm: "1.8vh",
|
|
77
|
+
md: "2.2vh",
|
|
78
|
+
lg: "2.8vh",
|
|
79
|
+
xl: "3.3vh",
|
|
80
|
+
xxl: "3.8vh"
|
|
81
|
+
},
|
|
82
|
+
spacing: {
|
|
83
|
+
xxs: "0.5vh",
|
|
84
|
+
xs: "0.75vh",
|
|
85
|
+
sm: "1.5vh",
|
|
86
|
+
md: "2vh",
|
|
87
|
+
lg: "3vh",
|
|
88
|
+
xl: "4vh",
|
|
89
|
+
xxl: "5vh"
|
|
90
|
+
},
|
|
91
|
+
components: {
|
|
92
|
+
Progress: {
|
|
93
|
+
styles: {
|
|
94
|
+
root: {
|
|
95
|
+
backgroundColor: "rgba(77, 77, 77, 0.4)"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
Select: {
|
|
100
|
+
styles: {
|
|
101
|
+
dropdown: {
|
|
102
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
103
|
+
},
|
|
104
|
+
input: {
|
|
105
|
+
padding: "var(--mantine-spacing-sm)"
|
|
106
|
+
},
|
|
107
|
+
item: {
|
|
108
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
109
|
+
},
|
|
110
|
+
wrapper: {
|
|
111
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
112
|
+
},
|
|
113
|
+
option: {
|
|
114
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
MultiSelect: {
|
|
119
|
+
styles: {
|
|
120
|
+
dropdown: {
|
|
121
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
122
|
+
},
|
|
123
|
+
pill: {
|
|
124
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
125
|
+
},
|
|
126
|
+
item: {
|
|
127
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
128
|
+
},
|
|
129
|
+
wrapper: {
|
|
130
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
131
|
+
},
|
|
132
|
+
option: {
|
|
133
|
+
borderRadius: "var(--mantine-radius-xxs)"
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
TextInput: {
|
|
138
|
+
styles: {
|
|
139
|
+
section: {
|
|
140
|
+
marginRight: "0.2vh"
|
|
141
|
+
},
|
|
142
|
+
input: {
|
|
143
|
+
padding: "var(--mantine-spacing-sm)"
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
colors: {
|
|
149
|
+
dark: [
|
|
150
|
+
"#ffffff",
|
|
151
|
+
"#e2e2e2",
|
|
152
|
+
"#c6c6c6",
|
|
153
|
+
"#aaaaaa",
|
|
154
|
+
"#8d8d8d",
|
|
155
|
+
"#717171",
|
|
156
|
+
"#555555",
|
|
157
|
+
"#393939",
|
|
158
|
+
"#1c1c1c",
|
|
159
|
+
"#000000"
|
|
160
|
+
],
|
|
161
|
+
dirk: [
|
|
162
|
+
"#ffffff",
|
|
163
|
+
"#f3fce9",
|
|
164
|
+
"#dbf5bd",
|
|
165
|
+
"#c3ee91",
|
|
166
|
+
"#ace765",
|
|
167
|
+
"#94e039",
|
|
168
|
+
"#7ac61f",
|
|
169
|
+
"#5f9a18",
|
|
170
|
+
"#29420a",
|
|
171
|
+
"#446e11"
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
var theme_default = theme;
|
|
176
|
+
library.add(fas, far, fab);
|
|
177
|
+
var useSettings = create((set) => ({
|
|
178
|
+
game: "rdr3",
|
|
179
|
+
primaryColor: "teal",
|
|
180
|
+
primaryShade: 6,
|
|
181
|
+
customTheme: {}
|
|
182
|
+
}));
|
|
183
|
+
function DirkProvider(props) {
|
|
184
|
+
useSettings((data) => data.primaryColor);
|
|
185
|
+
useSettings((data) => data.primaryShade);
|
|
186
|
+
useSettings((data) => data.customTheme);
|
|
187
|
+
return /* @__PURE__ */ jsx(MantineProvider, { theme: theme_default, defaultColorScheme: "dark", children: /* @__PURE__ */ jsx(Wrapper, { children: props.children }) });
|
|
188
|
+
}
|
|
189
|
+
function Wrapper({ children }) {
|
|
190
|
+
const game = useSettings((data) => data.game);
|
|
191
|
+
return isEnvBrowser() ? /* @__PURE__ */ jsx(
|
|
192
|
+
BackgroundImage,
|
|
193
|
+
{
|
|
194
|
+
w: "100vw",
|
|
195
|
+
h: "100vh",
|
|
196
|
+
style: { overflow: "hidden" },
|
|
197
|
+
src: game === "fivem" ? "https://i.ytimg.com/vi/TOxuNbXrO28/maxresdefault.jpg" : "https://raw.githubusercontent.com/Jump-On-Studios/RedM-jo_libs/refs/heads/main/source-repositories/Menu/public/assets/images/background_dev.jpg",
|
|
198
|
+
children
|
|
199
|
+
}
|
|
200
|
+
) : /* @__PURE__ */ jsx(Fragment, { children });
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export { DirkProvider, useSettings };
|
|
204
|
+
//# sourceMappingURL=index.mjs.map
|
|
205
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/misc.ts","../../src/utils/fetchNui.ts","../../src/utils/locales.ts","../../src/theme.ts","../../src/providers/DirkProvider.tsx"],"names":["create"],"mappings":"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","file":"index.mjs","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 { isEnvBrowser } from \"./misc\";\r\n\r\n/**\r\n * Simple wrapper around fetch API tailored for CEF/NUI use. This abstraction\r\n * can be extended to include AbortController if needed or if the response isn't\r\n * JSON. Tailor it to your needs.\r\n *\r\n * @param eventName - The endpoint eventname to target\r\n * @param data - Data you wish to send in the NUI Callback\r\n * @param mockData - Mock data to be returned if in the browser\r\n *\r\n * @return returnData - A promise for the data sent back by the NuiCallbacks CB argument\r\n */\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 console.log('Mock Data:', mockData);\r\n console.log('Is Env Browser:', isEnvBrowser());\r\n if (isEnvBrowser() && mockData !== undefined) return mockData;\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\r\n const respFormatted = await resp.json();\r\n\r\n return respFormatted;\r\n}\r\n\r\n/**\r\n * fetchOnLoad — triggers fetchNui immediately when called.\r\n * Can safely be used anywhere (even top-level, outside React).\r\n *\r\n * Usage:\r\n * fetchOnLoad<MyType>(\"getData\").then(data => myStore.setState({ data }));\r\n */\r\nexport function fetchOnLoad<T = unknown>(\r\n eventName: string,\r\n data?: unknown,\r\n mockData?: T\r\n): Promise<T> {\r\n // just call it directly\r\n return fetchNui<T>(eventName, data, mockData)\r\n .catch((err) => {\r\n console.error(`[fetchOnLoad] Failed for ${eventName}:`, err);\r\n throw err;\r\n });\r\n}\r\n\r\n\r\nexport const fetchLuaTable = <T>(tableName: string) => () => {\r\n if (isEnvBrowser()) {\r\n return Promise.resolve({} as T);\r\n }\r\n return fetchNui<T>('GET_LUA_TABLE', { tableName });\r\n};\r\n\r\n","import { create } from \"zustand\";\r\nimport { fetchOnLoad } from \"../utils/fetchNui\";\r\n\r\n\r\ntype localeType = (key: string, ...args: string[]) => string;\r\n\r\ntype LocalesProps = {\r\n [key: string]: string;\r\n}\r\n\r\ntype LocaleStoreProps = {\r\n locale: localeType;\r\n locales: LocalesProps;\r\n};\r\n\r\n\r\nexport const localeStore = create<LocaleStoreProps>((set, get) => {\r\n return {\r\n locales: {\r\n \"OccupantsDesc\": \"Here you can view and manage the occupants of your traphouse. These occupants can be used mainly for selling drugs to the NPCs surrounding your traphouse. However they have other uses to so be careful who you add as an occupant.\", \r\n },\r\n locale: (key: string, ...args: (string|number)[]): string => {\r\n const exists = get().locales[key];\r\n if (!exists){\r\n // add to a jsonfile called missing_locales.json within src of project \r\n \r\n }\r\n let translation = exists || key;\r\n if (args.length) {\r\n // convert the arg to a string and replace the %s in the translation\r\n \r\n\r\n translation = translation.replace(/%s/g, () => String(args.shift() || ''));\r\n }\r\n return translation;\r\n },\r\n };\r\n});\r\n\r\n// export locale as a standalone function \r\nexport const locale = localeStore.getState().locale;\r\n\r\nfetchOnLoad<LocalesProps>('GET_LOCALES').then((data) => {\r\n localeStore.setState({ locales: data });\r\n});\r\n","import { createTheme } from \"@mantine/core\";\r\n\r\nconst theme = createTheme({\r\n primaryColor: \"dirk\",\r\n primaryShade: 9,\r\n defaultRadius: \"xxs\",\r\n fontFamily: \"Akrobat Regular, sans-serif\",\r\n\r\n radius:{\r\n xxs: '0.2vh',\r\n xs: '0.4vh',\r\n sm: '0.75vh',\r\n md: '1vh',\r\n lg: '1.5vh',\r\n xl: '2vh',\r\n xxl: '3vh',\r\n },\r\n\r\n fontSizes: {\r\n xxs: '1.2vh',\r\n xs: '1.5vh',\r\n sm: '1.8vh',\r\n md: '2.2vh',\r\n lg: '2.8vh',\r\n xl: '3.3vh',\r\n xxl: '3.8vh',\r\n },\r\n\r\n spacing:{\r\n xxs: '0.5vh',\r\n xs: '0.75vh',\r\n sm: '1.5vh',\r\n md: '2vh',\r\n lg: '3vh',\r\n xl: '4vh',\r\n xxl: '5vh',\r\n },\r\n\r\n components:{\r\n Progress:{\r\n styles:{\r\n root:{\r\n backgroundColor: 'rgba(77, 77, 77, 0.4)',\r\n },\r\n \r\n }\r\n },\r\n\r\n Select:{\r\n styles:{\r\n dropdown:{\r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n input:{\r\n padding: 'var(--mantine-spacing-sm)',\r\n },\r\n item:{\r\n \r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n wrapper:{\r\n \r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n option:{\r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n\r\n }\r\n },\r\n MultiSelect:{\r\n styles:{\r\n dropdown:{\r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n pill:{\r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n item:{\r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n wrapper:{\r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n option:{\r\n borderRadius: 'var(--mantine-radius-xxs)',\r\n },\r\n\r\n }\r\n },\r\n TextInput:{\r\n styles:{\r\n section:{\r\n marginRight: '0.2vh',\r\n },\r\n\r\n input:{\r\n padding: 'var(--mantine-spacing-sm)',\r\n },\r\n\r\n \r\n \r\n }\r\n },\r\n },\r\n\r\n colors: {\r\n dark:[\r\n \"#ffffff\",\r\n \"#e2e2e2\",\r\n \"#c6c6c6\",\r\n \"#aaaaaa\",\r\n \"#8d8d8d\",\r\n \"#717171\",\r\n \"#555555\",\r\n \"#393939\",\r\n \"#1c1c1c\",\r\n \"#000000\",\r\n ],\r\n dirk:[\r\n \"#ffffff\",\r\n \"#f3fce9\",\r\n \"#dbf5bd\",\r\n \"#c3ee91\",\r\n \"#ace765\",\r\n \"#94e039\",\r\n \"#7ac61f\",\r\n \"#5f9a18\",\r\n \"#29420a\",\r\n \"#446e11\",\r\n ],\r\n },\r\n});\r\n\r\n\r\nexport default theme;","import '@mantine/notifications/styles.css';\r\nimport '@mantine/core/styles.css';\r\nimport '@/styles/niceFont.css';\r\nimport '@/styles/scrollBar.css';\r\n\r\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { fab } from \"@fortawesome/free-brands-svg-icons\";\r\nimport { far } from \"@fortawesome/free-regular-svg-icons\";\r\nimport { fas } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { BackgroundImage, MantineProvider } from '@mantine/core';\r\nimport { isEnvBrowser } from '@/utils';\r\nimport { create } from 'zustand';\r\nimport theme from '@/theme';\r\nlibrary.add(fas, far, fab);\r\n\r\nexport type DirkProviderProps = {\r\n fakeBackground?: boolean;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const useSettings = create<{\r\n game: 'rdr3' | 'fivem';\r\n primaryColor: string;\r\n primaryShade: number;\r\n customTheme: Record<string, string[]>;\r\n}>((set) => ({\r\n game: 'rdr3',\r\n primaryColor: 'teal',\r\n primaryShade: 6,\r\n customTheme: {},\r\n}));\r\n\r\nexport function DirkProvider(props: DirkProviderProps) {\r\n const primaryColor = useSettings((data) => data.primaryColor);\r\n const primaryShade = useSettings((data) => data.primaryShade);\r\n const customTheme = useSettings((data) => data.customTheme);\r\n \r\n // Ensure the theme is updated when the settings change\r\n\r\n // useEffect(() => {\r\n // const updatedTheme = {\r\n // ...theme, // Start with the existing theme object\r\n // colors: {\r\n // ...theme.colors, // Copy the existing colors\r\n // custom: customTheme\r\n // },\r\n // };\r\n \r\n // setCurTheme(updatedTheme);\r\n // // set primary color\r\n // setCurTheme({\r\n // ...updatedTheme,\r\n // primaryColor: primaryColor,\r\n // primaryShade: primaryShade,\r\n // });\r\n\r\n // }, [primaryColor, primaryShade, customTheme]);\r\n\r\n // useEffect(() => {\r\n // // fetchSettings();\r\n // runInitialFetches();\r\n // }, []);\r\n\r\n return (\r\n <MantineProvider theme={theme} defaultColorScheme='dark'>\r\n <Wrapper>\r\n {props.children}\r\n </Wrapper>\r\n </MantineProvider>\r\n );\r\n}\r\n\r\nfunction Wrapper({ children }: { children: React.ReactNode }) {\r\n const game = useSettings((data) => data.game);\r\n return isEnvBrowser() ? ( \r\n <BackgroundImage w='100vw' h='100vh' style={{overflow:'hidden'}}\r\n src={game === 'fivem' ?\r\n \"https://i.ytimg.com/vi/TOxuNbXrO28/maxresdefault.jpg\"\r\n : \"https://raw.githubusercontent.com/Jump-On-Studios/RedM-jo_libs/refs/heads/main/source-repositories/Menu/public/assets/images/background_dev.jpg\"}\r\n > \r\n {children}\r\n </BackgroundImage>\r\n ) : (\r\n <>{children}</>\r\n )\r\n}\r\n\r\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as zustand from 'zustand';
|
|
2
|
+
|
|
3
|
+
declare function colorWithAlpha(color: string, alpha: number): string;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Simple wrapper around fetch API tailored for CEF/NUI use. This abstraction
|
|
7
|
+
* can be extended to include AbortController if needed or if the response isn't
|
|
8
|
+
* JSON. Tailor it to your needs.
|
|
9
|
+
*
|
|
10
|
+
* @param eventName - The endpoint eventname to target
|
|
11
|
+
* @param data - Data you wish to send in the NUI Callback
|
|
12
|
+
* @param mockData - Mock data to be returned if in the browser
|
|
13
|
+
*
|
|
14
|
+
* @return returnData - A promise for the data sent back by the NuiCallbacks CB argument
|
|
15
|
+
*/
|
|
16
|
+
declare function fetchNui<T = unknown>(eventName: string, data?: unknown, mockData?: T): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* fetchOnLoad — triggers fetchNui immediately when called.
|
|
19
|
+
* Can safely be used anywhere (even top-level, outside React).
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* fetchOnLoad<MyType>("getData").then(data => myStore.setState({ data }));
|
|
23
|
+
*/
|
|
24
|
+
declare function fetchOnLoad<T = unknown>(eventName: string, data?: unknown, mockData?: T): Promise<T>;
|
|
25
|
+
declare const fetchLuaTable: <T>(tableName: string) => () => Promise<T>;
|
|
26
|
+
|
|
27
|
+
interface InternalEvent<T = unknown> {
|
|
28
|
+
action: string;
|
|
29
|
+
data?: T;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Emulates dispatching an event using SendNuiMessage in the lua scripts.
|
|
33
|
+
* This is used when developing in browser
|
|
34
|
+
*
|
|
35
|
+
* @param events - The event you want to cover
|
|
36
|
+
* @param timer - How long until it should trigger (ms)
|
|
37
|
+
*/
|
|
38
|
+
declare const internalEvent: <P>(events: InternalEvent<P>[], timer?: number) => void;
|
|
39
|
+
|
|
40
|
+
type localeType = (key: string, ...args: string[]) => string;
|
|
41
|
+
type LocalesProps = {
|
|
42
|
+
[key: string]: string;
|
|
43
|
+
};
|
|
44
|
+
type LocaleStoreProps = {
|
|
45
|
+
locale: localeType;
|
|
46
|
+
locales: LocalesProps;
|
|
47
|
+
};
|
|
48
|
+
declare const localeStore: zustand.UseBoundStore<zustand.StoreApi<LocaleStoreProps>>;
|
|
49
|
+
declare const locale: localeType;
|
|
50
|
+
|
|
51
|
+
declare const isEnvBrowser: () => boolean;
|
|
52
|
+
declare const noop: () => void;
|
|
53
|
+
declare const splitFAString: (faString: string) => {
|
|
54
|
+
prefix: string;
|
|
55
|
+
newIcon: string;
|
|
56
|
+
};
|
|
57
|
+
declare const numberToRoman: (num: number) => string;
|
|
58
|
+
declare const copyToClipboard: (text: string) => void;
|
|
59
|
+
declare const openLink: (url: string) => void;
|
|
60
|
+
|
|
61
|
+
export { type InternalEvent, colorWithAlpha, copyToClipboard, fetchLuaTable, fetchNui, fetchOnLoad, internalEvent, isEnvBrowser, locale, localeStore, noop, numberToRoman, openLink, splitFAString };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as zustand from 'zustand';
|
|
2
|
+
|
|
3
|
+
declare function colorWithAlpha(color: string, alpha: number): string;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Simple wrapper around fetch API tailored for CEF/NUI use. This abstraction
|
|
7
|
+
* can be extended to include AbortController if needed or if the response isn't
|
|
8
|
+
* JSON. Tailor it to your needs.
|
|
9
|
+
*
|
|
10
|
+
* @param eventName - The endpoint eventname to target
|
|
11
|
+
* @param data - Data you wish to send in the NUI Callback
|
|
12
|
+
* @param mockData - Mock data to be returned if in the browser
|
|
13
|
+
*
|
|
14
|
+
* @return returnData - A promise for the data sent back by the NuiCallbacks CB argument
|
|
15
|
+
*/
|
|
16
|
+
declare function fetchNui<T = unknown>(eventName: string, data?: unknown, mockData?: T): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* fetchOnLoad — triggers fetchNui immediately when called.
|
|
19
|
+
* Can safely be used anywhere (even top-level, outside React).
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* fetchOnLoad<MyType>("getData").then(data => myStore.setState({ data }));
|
|
23
|
+
*/
|
|
24
|
+
declare function fetchOnLoad<T = unknown>(eventName: string, data?: unknown, mockData?: T): Promise<T>;
|
|
25
|
+
declare const fetchLuaTable: <T>(tableName: string) => () => Promise<T>;
|
|
26
|
+
|
|
27
|
+
interface InternalEvent<T = unknown> {
|
|
28
|
+
action: string;
|
|
29
|
+
data?: T;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Emulates dispatching an event using SendNuiMessage in the lua scripts.
|
|
33
|
+
* This is used when developing in browser
|
|
34
|
+
*
|
|
35
|
+
* @param events - The event you want to cover
|
|
36
|
+
* @param timer - How long until it should trigger (ms)
|
|
37
|
+
*/
|
|
38
|
+
declare const internalEvent: <P>(events: InternalEvent<P>[], timer?: number) => void;
|
|
39
|
+
|
|
40
|
+
type localeType = (key: string, ...args: string[]) => string;
|
|
41
|
+
type LocalesProps = {
|
|
42
|
+
[key: string]: string;
|
|
43
|
+
};
|
|
44
|
+
type LocaleStoreProps = {
|
|
45
|
+
locale: localeType;
|
|
46
|
+
locales: LocalesProps;
|
|
47
|
+
};
|
|
48
|
+
declare const localeStore: zustand.UseBoundStore<zustand.StoreApi<LocaleStoreProps>>;
|
|
49
|
+
declare const locale: localeType;
|
|
50
|
+
|
|
51
|
+
declare const isEnvBrowser: () => boolean;
|
|
52
|
+
declare const noop: () => void;
|
|
53
|
+
declare const splitFAString: (faString: string) => {
|
|
54
|
+
prefix: string;
|
|
55
|
+
newIcon: string;
|
|
56
|
+
};
|
|
57
|
+
declare const numberToRoman: (num: number) => string;
|
|
58
|
+
declare const copyToClipboard: (text: string) => void;
|
|
59
|
+
declare const openLink: (url: string) => void;
|
|
60
|
+
|
|
61
|
+
export { type InternalEvent, colorWithAlpha, copyToClipboard, fetchLuaTable, fetchNui, fetchOnLoad, internalEvent, isEnvBrowser, locale, localeStore, noop, numberToRoman, openLink, splitFAString };
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zustand = require('zustand');
|
|
4
|
+
|
|
5
|
+
// src/utils/colorWithAlpha.ts
|
|
6
|
+
var colorNames = {
|
|
7
|
+
AliceBlue: { r: 240, g: 248, b: 255 },
|
|
8
|
+
AntiqueWhite: { r: 250, g: 235, b: 215 },
|
|
9
|
+
Aqua: { r: 0, g: 255, b: 255 },
|
|
10
|
+
Aquamarine: { r: 127, g: 255, b: 212 },
|
|
11
|
+
Azure: { r: 240, g: 255, b: 255 },
|
|
12
|
+
Beige: { r: 245, g: 245, b: 220 },
|
|
13
|
+
Bisque: { r: 255, g: 228, b: 196 },
|
|
14
|
+
Black: { r: 0, g: 0, b: 0 },
|
|
15
|
+
BlanchedAlmond: { r: 255, g: 235, b: 205 },
|
|
16
|
+
Blue: { r: 0, g: 0, b: 255 },
|
|
17
|
+
BlueViolet: { r: 138, g: 43, b: 226 },
|
|
18
|
+
Brown: { r: 165, g: 42, b: 42 },
|
|
19
|
+
BurlyWood: { r: 222, g: 184, b: 135 },
|
|
20
|
+
CadetBlue: { r: 95, g: 158, b: 160 },
|
|
21
|
+
Chartreuse: { r: 127, g: 255, b: 0 },
|
|
22
|
+
Chocolate: { r: 210, g: 105, b: 30 },
|
|
23
|
+
Coral: { r: 255, g: 127, b: 80 },
|
|
24
|
+
CornflowerBlue: { r: 100, g: 149, b: 237 },
|
|
25
|
+
Cornsilk: { r: 255, g: 248, b: 220 },
|
|
26
|
+
Crimson: { r: 220, g: 20, b: 60 },
|
|
27
|
+
Cyan: { r: 0, g: 255, b: 255 },
|
|
28
|
+
DarkBlue: { r: 0, g: 0, b: 139 },
|
|
29
|
+
DarkCyan: { r: 0, g: 139, b: 139 },
|
|
30
|
+
DarkGoldenRod: { r: 184, g: 134, b: 11 },
|
|
31
|
+
DarkGray: { r: 169, g: 169, b: 169 },
|
|
32
|
+
DarkGreen: { r: 0, g: 100, b: 0 },
|
|
33
|
+
DarkKhaki: { r: 189, g: 183, b: 107 },
|
|
34
|
+
DarkMagenta: { r: 139, g: 0, b: 139 },
|
|
35
|
+
DarkOliveGreen: { r: 85, g: 107, b: 47 },
|
|
36
|
+
DarkOrange: { r: 255, g: 140, b: 0 },
|
|
37
|
+
DarkOrchid: { r: 153, g: 50, b: 204 },
|
|
38
|
+
DarkRed: { r: 139, g: 0, b: 0 },
|
|
39
|
+
DarkSalmon: { r: 233, g: 150, b: 122 },
|
|
40
|
+
DarkSeaGreen: { r: 143, g: 188, b: 143 },
|
|
41
|
+
DarkSlateBlue: { r: 72, g: 61, b: 139 },
|
|
42
|
+
DarkSlateGray: { r: 47, g: 79, b: 79 },
|
|
43
|
+
DarkTurquoise: { r: 0, g: 206, b: 209 },
|
|
44
|
+
DarkViolet: { r: 148, g: 0, b: 211 },
|
|
45
|
+
DeepPink: { r: 255, g: 20, b: 147 },
|
|
46
|
+
DeepSkyBlue: { r: 0, g: 191, b: 255 },
|
|
47
|
+
DimGray: { r: 105, g: 105, b: 105 },
|
|
48
|
+
DodgerBlue: { r: 30, g: 144, b: 255 },
|
|
49
|
+
FireBrick: { r: 178, g: 34, b: 34 },
|
|
50
|
+
FloralWhite: { r: 255, g: 250, b: 240 },
|
|
51
|
+
ForestGreen: { r: 34, g: 139, b: 34 },
|
|
52
|
+
Fuchsia: { r: 255, g: 0, b: 255 },
|
|
53
|
+
Gainsboro: { r: 220, g: 220, b: 220 },
|
|
54
|
+
GhostWhite: { r: 248, g: 248, b: 255 },
|
|
55
|
+
Gold: { r: 255, g: 215, b: 0 },
|
|
56
|
+
GoldenRod: { r: 218, g: 165, b: 32 },
|
|
57
|
+
Gray: { r: 128, g: 128, b: 128 },
|
|
58
|
+
Green: { r: 0, g: 128, b: 0 },
|
|
59
|
+
GreenYellow: { r: 173, g: 255, b: 47 },
|
|
60
|
+
HoneyDew: { r: 240, g: 255, b: 240 },
|
|
61
|
+
HotPink: { r: 255, g: 105, b: 180 },
|
|
62
|
+
IndianRed: { r: 205, g: 92, b: 92 },
|
|
63
|
+
Indigo: { r: 75, g: 0, b: 130 },
|
|
64
|
+
Ivory: { r: 255, g: 255, b: 240 },
|
|
65
|
+
Khaki: { r: 240, g: 230, b: 140 },
|
|
66
|
+
Lavender: { r: 230, g: 230, b: 250 },
|
|
67
|
+
LavenderBlush: { r: 255, g: 240, b: 245 },
|
|
68
|
+
LawnGreen: { r: 124, g: 252, b: 0 },
|
|
69
|
+
LemonChiffon: { r: 255, g: 250, b: 205 },
|
|
70
|
+
LightBlue: { r: 173, g: 216, b: 230 },
|
|
71
|
+
LightCoral: { r: 240, g: 128, b: 128 },
|
|
72
|
+
LightCyan: { r: 224, g: 255, b: 255 },
|
|
73
|
+
LightGoldenRodYellow: { r: 250, g: 250, b: 210 },
|
|
74
|
+
LightGray: { r: 211, g: 211, b: 211 },
|
|
75
|
+
LightGreen: { r: 144, g: 238, b: 144 },
|
|
76
|
+
LightPink: { r: 255, g: 182, b: 193 },
|
|
77
|
+
LightSalmon: { r: 255, g: 160, b: 122 },
|
|
78
|
+
LightSeaGreen: { r: 32, g: 178, b: 170 },
|
|
79
|
+
LightSkyBlue: { r: 135, g: 206, b: 250 },
|
|
80
|
+
LightSlateGray: { r: 119, g: 136, b: 153 },
|
|
81
|
+
LightSteelBlue: { r: 176, g: 196, b: 222 },
|
|
82
|
+
LightYellow: { r: 255, g: 255, b: 224 },
|
|
83
|
+
Lime: { r: 0, g: 255, b: 0 },
|
|
84
|
+
LimeGreen: { r: 50, g: 205, b: 50 },
|
|
85
|
+
Linen: { r: 250, g: 240, b: 230 },
|
|
86
|
+
Magenta: { r: 255, g: 0, b: 255 },
|
|
87
|
+
Maroon: { r: 128, g: 0, b: 0 },
|
|
88
|
+
// Maroon
|
|
89
|
+
MediumAquaMarine: { r: 102, g: 205, b: 170 },
|
|
90
|
+
MediumBlue: { r: 0, g: 0, b: 205 },
|
|
91
|
+
MediumOrchid: { r: 186, g: 85, b: 211 },
|
|
92
|
+
MediumPurple: { r: 147, g: 112, b: 219 },
|
|
93
|
+
MediumSeaGreen: { r: 60, g: 179, b: 113 },
|
|
94
|
+
MediumSlateBlue: { r: 123, g: 104, b: 238 },
|
|
95
|
+
MediumSpringGreen: { r: 0, g: 250, b: 154 },
|
|
96
|
+
MediumTurquoise: { r: 72, g: 209, b: 204 },
|
|
97
|
+
MediumVioletRed: { r: 199, g: 21, b: 133 },
|
|
98
|
+
MidnightBlue: { r: 25, g: 25, b: 112 },
|
|
99
|
+
MintCream: { r: 245, g: 255, b: 250 },
|
|
100
|
+
MistyRose: { r: 255, g: 228, b: 225 },
|
|
101
|
+
Moccasin: { r: 255, g: 228, b: 181 },
|
|
102
|
+
NavajoWhite: { r: 255, g: 222, b: 173 },
|
|
103
|
+
Navy: { r: 0, g: 0, b: 128 },
|
|
104
|
+
OldLace: { r: 253, g: 245, b: 230 },
|
|
105
|
+
Olive: { r: 128, g: 128, b: 0 },
|
|
106
|
+
OliveDrab: { r: 107, g: 142, b: 35 },
|
|
107
|
+
Orange: { r: 255, g: 165, b: 0 },
|
|
108
|
+
OrangeRed: { r: 255, g: 69, b: 0 },
|
|
109
|
+
Orchid: { r: 218, g: 112, b: 214 },
|
|
110
|
+
PaleGoldenRod: { r: 238, g: 232, b: 170 },
|
|
111
|
+
PaleGreen: { r: 152, g: 251, b: 152 },
|
|
112
|
+
PaleTurquoise: { r: 175, g: 238, b: 238 },
|
|
113
|
+
PaleVioletRed: { r: 219, g: 112, b: 147 },
|
|
114
|
+
PapayaWhip: { r: 255, g: 239, b: 213 },
|
|
115
|
+
PeachPuff: { r: 255, g: 218, b: 185 },
|
|
116
|
+
Peru: { r: 205, g: 133, b: 63 },
|
|
117
|
+
Pink: { r: 255, g: 192, b: 203 },
|
|
118
|
+
Plum: { r: 221, g: 160, b: 221 },
|
|
119
|
+
PowderBlue: { r: 176, g: 224, b: 230 },
|
|
120
|
+
Purple: { r: 128, g: 0, b: 128 },
|
|
121
|
+
RebeccaPurple: { r: 102, g: 51, b: 153 },
|
|
122
|
+
Red: { r: 255, g: 0, b: 0 },
|
|
123
|
+
RosyBrown: { r: 188, g: 143, b: 143 },
|
|
124
|
+
RoyalBlue: { r: 65, g: 105, b: 225 },
|
|
125
|
+
SaddleBrown: { r: 139, g: 69, b: 19 },
|
|
126
|
+
Salmon: { r: 250, g: 128, b: 114 },
|
|
127
|
+
SandyBrown: { r: 244, g: 164, b: 96 },
|
|
128
|
+
SeaGreen: { r: 46, g: 139, b: 87 },
|
|
129
|
+
SeaShell: { r: 255, g: 245, b: 238 },
|
|
130
|
+
Sienna: { r: 160, g: 82, b: 45 },
|
|
131
|
+
Silver: { r: 192, g: 192, b: 192 },
|
|
132
|
+
SkyBlue: { r: 135, g: 206, b: 235 },
|
|
133
|
+
SlateBlue: { r: 106, g: 90, b: 205 },
|
|
134
|
+
SlateGray: { r: 112, g: 128, b: 144 },
|
|
135
|
+
Snow: { r: 255, g: 250, b: 250 },
|
|
136
|
+
SpringGreen: { r: 0, g: 255, b: 127 },
|
|
137
|
+
SteelBlue: { r: 70, g: 130, b: 180 },
|
|
138
|
+
Tan: { r: 210, g: 180, b: 140 },
|
|
139
|
+
Teal: { r: 0, g: 128, b: 128 },
|
|
140
|
+
Thistle: { r: 216, g: 191, b: 216 },
|
|
141
|
+
Tomato: { r: 255, g: 99, b: 71 },
|
|
142
|
+
Turquoise: { r: 64, g: 224, b: 208 },
|
|
143
|
+
Violet: { r: 238, g: 130, b: 238 },
|
|
144
|
+
Wheat: { r: 245, g: 222, b: 179 },
|
|
145
|
+
White: { r: 255, g: 255, b: 255 },
|
|
146
|
+
WhiteSmoke: { r: 245, g: 245, b: 245 },
|
|
147
|
+
Yellow: { r: 255, g: 255, b: 0 },
|
|
148
|
+
YellowGreen: { r: 154, g: 205, b: 50 }
|
|
149
|
+
};
|
|
150
|
+
function colorWithAlpha(color, alpha) {
|
|
151
|
+
const lowerCasedColor = color.toLowerCase();
|
|
152
|
+
if (colorNames[lowerCasedColor]) {
|
|
153
|
+
const rgb = colorNames[lowerCasedColor];
|
|
154
|
+
return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;
|
|
155
|
+
}
|
|
156
|
+
if (/^#([A-Fa-f0-9]{6})$/.test(color)) {
|
|
157
|
+
const hex = color.slice(1);
|
|
158
|
+
const bigint = parseInt(hex, 16);
|
|
159
|
+
const r = bigint >> 16 & 255;
|
|
160
|
+
const g = bigint >> 8 & 255;
|
|
161
|
+
const b = bigint & 255;
|
|
162
|
+
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
163
|
+
}
|
|
164
|
+
if (/^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/.test(color)) {
|
|
165
|
+
const result = color.match(/^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/);
|
|
166
|
+
if (result) {
|
|
167
|
+
return `rgba(${result[1]}, ${result[2]}, ${result[3]}, ${alpha})`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return color;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// src/utils/misc.ts
|
|
174
|
+
var isEnvBrowser = () => !window.invokeNative;
|
|
175
|
+
var noop = () => {
|
|
176
|
+
};
|
|
177
|
+
var splitFAString = (faString) => {
|
|
178
|
+
const [prefix, newIcon] = faString.split("-");
|
|
179
|
+
if (!prefix || !newIcon) return { prefix: "fas", newIcon: "question" };
|
|
180
|
+
return { prefix, newIcon };
|
|
181
|
+
};
|
|
182
|
+
var numberToRoman = (num) => {
|
|
183
|
+
const romanNumerals = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX"];
|
|
184
|
+
return romanNumerals[num];
|
|
185
|
+
};
|
|
186
|
+
var copyToClipboard = (text) => {
|
|
187
|
+
const el = document.createElement("textarea");
|
|
188
|
+
el.value = text;
|
|
189
|
+
document.body.appendChild(el);
|
|
190
|
+
el.select();
|
|
191
|
+
document.execCommand("copy");
|
|
192
|
+
document.body.removeChild(el);
|
|
193
|
+
};
|
|
194
|
+
var openLink = (url) => {
|
|
195
|
+
if (isEnvBrowser()) {
|
|
196
|
+
window.open(url, "_blank");
|
|
197
|
+
} else {
|
|
198
|
+
window.invokeNative("openLink", url);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// src/utils/fetchNui.ts
|
|
203
|
+
async function fetchNui(eventName, data, mockData) {
|
|
204
|
+
const options = {
|
|
205
|
+
method: "post",
|
|
206
|
+
headers: {
|
|
207
|
+
"Content-Type": "application/json; charset=UTF-8"
|
|
208
|
+
},
|
|
209
|
+
body: JSON.stringify(data)
|
|
210
|
+
};
|
|
211
|
+
console.log("Mock Data:", mockData);
|
|
212
|
+
console.log("Is Env Browser:", isEnvBrowser());
|
|
213
|
+
if (isEnvBrowser() && mockData !== void 0) return mockData;
|
|
214
|
+
const resourceName = window.GetParentResourceName ? window.GetParentResourceName() : "nui-frame-app";
|
|
215
|
+
const resp = await fetch(`https://${resourceName}/${eventName}`, options);
|
|
216
|
+
const respFormatted = await resp.json();
|
|
217
|
+
return respFormatted;
|
|
218
|
+
}
|
|
219
|
+
function fetchOnLoad(eventName, data, mockData) {
|
|
220
|
+
return fetchNui(eventName, data, mockData).catch((err) => {
|
|
221
|
+
console.error(`[fetchOnLoad] Failed for ${eventName}:`, err);
|
|
222
|
+
throw err;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
var fetchLuaTable = (tableName) => () => {
|
|
226
|
+
if (isEnvBrowser()) {
|
|
227
|
+
return Promise.resolve({});
|
|
228
|
+
}
|
|
229
|
+
return fetchNui("GET_LUA_TABLE", { tableName });
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
// src/utils/internalEvent.ts
|
|
233
|
+
var internalEvent = (events, timer = 1e3) => {
|
|
234
|
+
if (isEnvBrowser()) {
|
|
235
|
+
for (const event of events) {
|
|
236
|
+
setTimeout(() => {
|
|
237
|
+
window.dispatchEvent(
|
|
238
|
+
new MessageEvent("message", {
|
|
239
|
+
data: {
|
|
240
|
+
action: event.action,
|
|
241
|
+
data: event.data
|
|
242
|
+
}
|
|
243
|
+
})
|
|
244
|
+
);
|
|
245
|
+
}, timer);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
var localeStore = zustand.create((set, get) => {
|
|
250
|
+
return {
|
|
251
|
+
locales: {
|
|
252
|
+
"OccupantsDesc": "Here you can view and manage the occupants of your traphouse. These occupants can be used mainly for selling drugs to the NPCs surrounding your traphouse. However they have other uses to so be careful who you add as an occupant."
|
|
253
|
+
},
|
|
254
|
+
locale: (key, ...args) => {
|
|
255
|
+
const exists = get().locales[key];
|
|
256
|
+
let translation = exists || key;
|
|
257
|
+
if (args.length) {
|
|
258
|
+
translation = translation.replace(/%s/g, () => String(args.shift() || ""));
|
|
259
|
+
}
|
|
260
|
+
return translation;
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
var locale = localeStore.getState().locale;
|
|
265
|
+
fetchOnLoad("GET_LOCALES").then((data) => {
|
|
266
|
+
localeStore.setState({ locales: data });
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
exports.colorWithAlpha = colorWithAlpha;
|
|
270
|
+
exports.copyToClipboard = copyToClipboard;
|
|
271
|
+
exports.fetchLuaTable = fetchLuaTable;
|
|
272
|
+
exports.fetchNui = fetchNui;
|
|
273
|
+
exports.fetchOnLoad = fetchOnLoad;
|
|
274
|
+
exports.internalEvent = internalEvent;
|
|
275
|
+
exports.isEnvBrowser = isEnvBrowser;
|
|
276
|
+
exports.locale = locale;
|
|
277
|
+
exports.localeStore = localeStore;
|
|
278
|
+
exports.noop = noop;
|
|
279
|
+
exports.numberToRoman = numberToRoman;
|
|
280
|
+
exports.openLink = openLink;
|
|
281
|
+
exports.splitFAString = splitFAString;
|
|
282
|
+
//# sourceMappingURL=index.js.map
|
|
283
|
+
//# sourceMappingURL=index.js.map
|