lokal-react 1.1.9 → 1.2.1

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/index.js ADDED
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // packages/react/src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ LokalProvider: () => LokalProvider,
24
+ useLokal: () => useLokal
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+
28
+ // packages/react/src/context/LokalContext.tsx
29
+ var import_react = require("react");
30
+ var import_jsx_runtime = require("react/jsx-runtime");
31
+ var defaultStorage = {
32
+ getItem: (key) => {
33
+ if (typeof window === "undefined") return Promise.resolve(null);
34
+ return Promise.resolve(localStorage.getItem(key));
35
+ },
36
+ setItem: (key, value) => {
37
+ if (typeof window === "undefined") return Promise.resolve();
38
+ localStorage.setItem(key, value);
39
+ return Promise.resolve();
40
+ }
41
+ };
42
+ var LokalContext = (0, import_react.createContext)(null);
43
+ function LokalProvider({
44
+ children,
45
+ locale: initialLocale = "en",
46
+ locales = ["en"],
47
+ translations: initialTranslations = {},
48
+ storage = defaultStorage,
49
+ namespace = "locales",
50
+ defaultLocale = "en",
51
+ onLocaleChange
52
+ }) {
53
+ const [locale, setLocaleState] = (0, import_react.useState)(initialLocale);
54
+ const [translations, setTranslations] = (0, import_react.useState)(initialTranslations);
55
+ const [isLoading, setIsLoading] = (0, import_react.useState)(true);
56
+ (0, import_react.useEffect)(() => {
57
+ const loadLocale = async () => {
58
+ try {
59
+ const savedLocale = await storage.getItem(`${namespace}-locale`);
60
+ if (savedLocale && locales.includes(savedLocale)) {
61
+ setLocaleState(savedLocale);
62
+ } else {
63
+ const browserLocale = navigator.language.split("-")[0];
64
+ if (locales.includes(browserLocale)) {
65
+ setLocaleState(browserLocale);
66
+ }
67
+ }
68
+ } catch (error) {
69
+ console.warn("Failed to load locale from storage:", error);
70
+ } finally {
71
+ setIsLoading(false);
72
+ }
73
+ };
74
+ loadLocale();
75
+ }, [storage, locales, namespace]);
76
+ (0, import_react.useEffect)(() => {
77
+ const loadTranslations = async () => {
78
+ try {
79
+ const storedData = await storage.getItem(`${namespace}-translations`);
80
+ if (storedData) {
81
+ const parsed = JSON.parse(storedData);
82
+ if (parsed[locale]) {
83
+ setTranslations(parsed[locale]);
84
+ }
85
+ }
86
+ } catch (error) {
87
+ console.warn("Failed to load translations from storage:", error);
88
+ }
89
+ };
90
+ if (!isLoading) {
91
+ loadTranslations();
92
+ }
93
+ }, [locale, storage, namespace, isLoading]);
94
+ const setLocale = (0, import_react.useCallback)((newLocale) => {
95
+ if (!locales.includes(newLocale)) {
96
+ console.warn(`Locale ${newLocale} is not in the list of available locales`);
97
+ return;
98
+ }
99
+ setLocaleState(newLocale);
100
+ storage.setItem(`${namespace}-locale`, newLocale);
101
+ if (onLocaleChange) {
102
+ onLocaleChange(newLocale);
103
+ }
104
+ }, [locales, storage, namespace, onLocaleChange]);
105
+ const t = (0, import_react.useCallback)((key, params) => {
106
+ const keys = key.split(".");
107
+ let value = translations;
108
+ for (const k of keys) {
109
+ if (value && typeof value === "object" && k in value) {
110
+ value = value[k];
111
+ } else {
112
+ return key;
113
+ }
114
+ }
115
+ if (typeof value !== "string") {
116
+ return key;
117
+ }
118
+ if (params) {
119
+ return Object.entries(params).reduce(
120
+ (str, [paramKey, paramValue]) => str.replace(new RegExp(`{{${paramKey}}}`, "g"), String(paramValue)),
121
+ value
122
+ );
123
+ }
124
+ return value;
125
+ }, [translations]);
126
+ const contextValue = {
127
+ locale,
128
+ setLocale,
129
+ locales,
130
+ t,
131
+ translations,
132
+ isLoading
133
+ };
134
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LokalContext.Provider, { value: contextValue, children });
135
+ }
136
+ function useLokal() {
137
+ const context = (0, import_react.useContext)(LokalContext);
138
+ if (!context) {
139
+ throw new Error("useLokal must be used within a LokalProvider");
140
+ }
141
+ return context;
142
+ }
143
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/context/LokalContext.tsx"],"sourcesContent":["// Main exports\nexport { LokalProvider, useLokal } from './context/LokalContext';\nexport type { LokalProviderProps, TranslateFunction, StorageInterface } from './context/LokalContext';\nexport type { LokalContextValue } from './context/LokalContext';\n\n// Re-export types from lokal-core\nexport type { LocaleData } from 'lokal-core';\n","import React, { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\nimport type { LocaleData } from 'lokal-core';\n\n// Type for translation function\nexport type TranslateFunction = <K extends string>(\n key: K,\n params?: Record<string, string | number>\n) => string;\n\n// Storage interface for different platforms\nexport interface StorageInterface {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n}\n\n// Default to localStorage for web\nconst defaultStorage: StorageInterface = {\n getItem: (key: string) => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n return Promise.resolve(localStorage.getItem(key));\n },\n setItem: (key: string, value: string) => {\n if (typeof window === 'undefined') return Promise.resolve();\n localStorage.setItem(key, value);\n return Promise.resolve();\n },\n};\n\nexport interface LokalContextValue {\n locale: string;\n setLocale: (locale: string) => void;\n locales: string[];\n t: TranslateFunction;\n translations: LocaleData;\n isLoading: boolean;\n}\n\nconst LokalContext = createContext<LokalContextValue | null>(null);\n\nexport interface LokalProviderProps {\n children: ReactNode;\n locale?: string;\n locales?: string[];\n translations?: LocaleData;\n storage?: StorageInterface;\n namespace?: string;\n defaultLocale?: string;\n onLocaleChange?: (locale: string) => void;\n}\n\ninterface StoredTranslations {\n [locale: string]: LocaleData;\n}\n\n/**\n * LokalProvider - Provides localization context to your React app\n */\nexport function LokalProvider({\n children,\n locale: initialLocale = 'en',\n locales = ['en'],\n translations: initialTranslations = {},\n storage = defaultStorage,\n namespace = 'locales',\n defaultLocale = 'en',\n onLocaleChange,\n}: LokalProviderProps) {\n const [locale, setLocaleState] = useState<string>(initialLocale);\n const [translations, setTranslations] = useState<LocaleData>(initialTranslations);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n\n // Load saved locale and translations from storage\n useEffect(() => {\n const loadLocale = async () => {\n try {\n const savedLocale = await storage.getItem(`${namespace}-locale`);\n if (savedLocale && locales.includes(savedLocale)) {\n setLocaleState(savedLocale);\n } else {\n // Try to detect from browser\n const browserLocale = navigator.language.split('-')[0];\n if (locales.includes(browserLocale)) {\n setLocaleState(browserLocale);\n }\n }\n } catch (error) {\n console.warn('Failed to load locale from storage:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n loadLocale();\n }, [storage, locales, namespace]);\n\n // Load translations for current locale\n useEffect(() => {\n const loadTranslations = async () => {\n try {\n const storedData = await storage.getItem(`${namespace}-translations`);\n if (storedData) {\n const parsed: StoredTranslations = JSON.parse(storedData);\n if (parsed[locale]) {\n setTranslations(parsed[locale]);\n }\n }\n } catch (error) {\n console.warn('Failed to load translations from storage:', error);\n }\n };\n\n if (!isLoading) {\n loadTranslations();\n }\n }, [locale, storage, namespace, isLoading]);\n\n // Set locale and persist\n const setLocale = useCallback((newLocale: string) => {\n if (!locales.includes(newLocale)) {\n console.warn(`Locale ${newLocale} is not in the list of available locales`);\n return;\n }\n\n setLocaleState(newLocale);\n storage.setItem(`${namespace}-locale`, newLocale);\n\n if (onLocaleChange) {\n onLocaleChange(newLocale);\n }\n }, [locales, storage, namespace, onLocaleChange]);\n\n // Translation function\n const t = useCallback<TranslateFunction>((key, params) => {\n const keys = key.split('.');\n let value: any = translations;\n\n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n // Return key if not found\n return key;\n }\n }\n\n if (typeof value !== 'string') {\n return key;\n }\n\n // Replace parameters\n if (params) {\n return Object.entries(params).reduce(\n (str, [paramKey, paramValue]) => str.replace(new RegExp(`{{${paramKey}}}`, 'g'), String(paramValue)),\n value\n );\n }\n\n return value;\n }, [translations]);\n\n const contextValue: LokalContextValue = {\n locale,\n setLocale,\n locales,\n t,\n translations,\n isLoading,\n };\n\n return (\n <LokalContext.Provider value={contextValue}>\n {children}\n </LokalContext.Provider>\n );\n}\n\n/**\n * Hook to access the Lokal context\n */\nexport function useLokal(): LokalContextValue {\n const context = useContext(LokalContext);\n\n if (!context) {\n throw new Error('useLokal must be used within a LokalProvider');\n }\n\n return context;\n}\n\nexport default LokalContext;\n"],"mappings":"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","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,120 @@
1
+ // packages/react/src/context/LokalContext.tsx
2
+ import { createContext, useContext, useState, useEffect, useCallback } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ var defaultStorage = {
5
+ getItem: (key) => {
6
+ if (typeof window === "undefined") return Promise.resolve(null);
7
+ return Promise.resolve(localStorage.getItem(key));
8
+ },
9
+ setItem: (key, value) => {
10
+ if (typeof window === "undefined") return Promise.resolve();
11
+ localStorage.setItem(key, value);
12
+ return Promise.resolve();
13
+ }
14
+ };
15
+ var LokalContext = createContext(null);
16
+ function LokalProvider({
17
+ children,
18
+ locale: initialLocale = "en",
19
+ locales = ["en"],
20
+ translations: initialTranslations = {},
21
+ storage = defaultStorage,
22
+ namespace = "locales",
23
+ defaultLocale = "en",
24
+ onLocaleChange
25
+ }) {
26
+ const [locale, setLocaleState] = useState(initialLocale);
27
+ const [translations, setTranslations] = useState(initialTranslations);
28
+ const [isLoading, setIsLoading] = useState(true);
29
+ useEffect(() => {
30
+ const loadLocale = async () => {
31
+ try {
32
+ const savedLocale = await storage.getItem(`${namespace}-locale`);
33
+ if (savedLocale && locales.includes(savedLocale)) {
34
+ setLocaleState(savedLocale);
35
+ } else {
36
+ const browserLocale = navigator.language.split("-")[0];
37
+ if (locales.includes(browserLocale)) {
38
+ setLocaleState(browserLocale);
39
+ }
40
+ }
41
+ } catch (error) {
42
+ console.warn("Failed to load locale from storage:", error);
43
+ } finally {
44
+ setIsLoading(false);
45
+ }
46
+ };
47
+ loadLocale();
48
+ }, [storage, locales, namespace]);
49
+ useEffect(() => {
50
+ const loadTranslations = async () => {
51
+ try {
52
+ const storedData = await storage.getItem(`${namespace}-translations`);
53
+ if (storedData) {
54
+ const parsed = JSON.parse(storedData);
55
+ if (parsed[locale]) {
56
+ setTranslations(parsed[locale]);
57
+ }
58
+ }
59
+ } catch (error) {
60
+ console.warn("Failed to load translations from storage:", error);
61
+ }
62
+ };
63
+ if (!isLoading) {
64
+ loadTranslations();
65
+ }
66
+ }, [locale, storage, namespace, isLoading]);
67
+ const setLocale = useCallback((newLocale) => {
68
+ if (!locales.includes(newLocale)) {
69
+ console.warn(`Locale ${newLocale} is not in the list of available locales`);
70
+ return;
71
+ }
72
+ setLocaleState(newLocale);
73
+ storage.setItem(`${namespace}-locale`, newLocale);
74
+ if (onLocaleChange) {
75
+ onLocaleChange(newLocale);
76
+ }
77
+ }, [locales, storage, namespace, onLocaleChange]);
78
+ const t = useCallback((key, params) => {
79
+ const keys = key.split(".");
80
+ let value = translations;
81
+ for (const k of keys) {
82
+ if (value && typeof value === "object" && k in value) {
83
+ value = value[k];
84
+ } else {
85
+ return key;
86
+ }
87
+ }
88
+ if (typeof value !== "string") {
89
+ return key;
90
+ }
91
+ if (params) {
92
+ return Object.entries(params).reduce(
93
+ (str, [paramKey, paramValue]) => str.replace(new RegExp(`{{${paramKey}}}`, "g"), String(paramValue)),
94
+ value
95
+ );
96
+ }
97
+ return value;
98
+ }, [translations]);
99
+ const contextValue = {
100
+ locale,
101
+ setLocale,
102
+ locales,
103
+ t,
104
+ translations,
105
+ isLoading
106
+ };
107
+ return /* @__PURE__ */ jsx(LokalContext.Provider, { value: contextValue, children });
108
+ }
109
+ function useLokal() {
110
+ const context = useContext(LokalContext);
111
+ if (!context) {
112
+ throw new Error("useLokal must be used within a LokalProvider");
113
+ }
114
+ return context;
115
+ }
116
+ export {
117
+ LokalProvider,
118
+ useLokal
119
+ };
120
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/LokalContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\nimport type { LocaleData } from 'lokal-core';\n\n// Type for translation function\nexport type TranslateFunction = <K extends string>(\n key: K,\n params?: Record<string, string | number>\n) => string;\n\n// Storage interface for different platforms\nexport interface StorageInterface {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n}\n\n// Default to localStorage for web\nconst defaultStorage: StorageInterface = {\n getItem: (key: string) => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n return Promise.resolve(localStorage.getItem(key));\n },\n setItem: (key: string, value: string) => {\n if (typeof window === 'undefined') return Promise.resolve();\n localStorage.setItem(key, value);\n return Promise.resolve();\n },\n};\n\nexport interface LokalContextValue {\n locale: string;\n setLocale: (locale: string) => void;\n locales: string[];\n t: TranslateFunction;\n translations: LocaleData;\n isLoading: boolean;\n}\n\nconst LokalContext = createContext<LokalContextValue | null>(null);\n\nexport interface LokalProviderProps {\n children: ReactNode;\n locale?: string;\n locales?: string[];\n translations?: LocaleData;\n storage?: StorageInterface;\n namespace?: string;\n defaultLocale?: string;\n onLocaleChange?: (locale: string) => void;\n}\n\ninterface StoredTranslations {\n [locale: string]: LocaleData;\n}\n\n/**\n * LokalProvider - Provides localization context to your React app\n */\nexport function LokalProvider({\n children,\n locale: initialLocale = 'en',\n locales = ['en'],\n translations: initialTranslations = {},\n storage = defaultStorage,\n namespace = 'locales',\n defaultLocale = 'en',\n onLocaleChange,\n}: LokalProviderProps) {\n const [locale, setLocaleState] = useState<string>(initialLocale);\n const [translations, setTranslations] = useState<LocaleData>(initialTranslations);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n\n // Load saved locale and translations from storage\n useEffect(() => {\n const loadLocale = async () => {\n try {\n const savedLocale = await storage.getItem(`${namespace}-locale`);\n if (savedLocale && locales.includes(savedLocale)) {\n setLocaleState(savedLocale);\n } else {\n // Try to detect from browser\n const browserLocale = navigator.language.split('-')[0];\n if (locales.includes(browserLocale)) {\n setLocaleState(browserLocale);\n }\n }\n } catch (error) {\n console.warn('Failed to load locale from storage:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n loadLocale();\n }, [storage, locales, namespace]);\n\n // Load translations for current locale\n useEffect(() => {\n const loadTranslations = async () => {\n try {\n const storedData = await storage.getItem(`${namespace}-translations`);\n if (storedData) {\n const parsed: StoredTranslations = JSON.parse(storedData);\n if (parsed[locale]) {\n setTranslations(parsed[locale]);\n }\n }\n } catch (error) {\n console.warn('Failed to load translations from storage:', error);\n }\n };\n\n if (!isLoading) {\n loadTranslations();\n }\n }, [locale, storage, namespace, isLoading]);\n\n // Set locale and persist\n const setLocale = useCallback((newLocale: string) => {\n if (!locales.includes(newLocale)) {\n console.warn(`Locale ${newLocale} is not in the list of available locales`);\n return;\n }\n\n setLocaleState(newLocale);\n storage.setItem(`${namespace}-locale`, newLocale);\n\n if (onLocaleChange) {\n onLocaleChange(newLocale);\n }\n }, [locales, storage, namespace, onLocaleChange]);\n\n // Translation function\n const t = useCallback<TranslateFunction>((key, params) => {\n const keys = key.split('.');\n let value: any = translations;\n\n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n // Return key if not found\n return key;\n }\n }\n\n if (typeof value !== 'string') {\n return key;\n }\n\n // Replace parameters\n if (params) {\n return Object.entries(params).reduce(\n (str, [paramKey, paramValue]) => str.replace(new RegExp(`{{${paramKey}}}`, 'g'), String(paramValue)),\n value\n );\n }\n\n return value;\n }, [translations]);\n\n const contextValue: LokalContextValue = {\n locale,\n setLocale,\n locales,\n t,\n translations,\n isLoading,\n };\n\n return (\n <LokalContext.Provider value={contextValue}>\n {children}\n </LokalContext.Provider>\n );\n}\n\n/**\n * Hook to access the Lokal context\n */\nexport function useLokal(): LokalContextValue {\n const context = useContext(LokalContext);\n\n if (!context) {\n throw new Error('useLokal must be used within a LokalProvider');\n }\n\n return context;\n}\n\nexport default LokalContext;\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,10 +1,14 @@
1
1
  {
2
2
  "name": "lokal-react",
3
- "version": "1.1.9",
3
+ "version": "1.2.1",
4
4
  "description": "React & React Native adapter for LOKAL - Hooks and Context Providers",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "src"
11
+ ],
8
12
  "exports": {
9
13
  ".": {
10
14
  "types": "./dist/index.d.ts",
package/tsconfig.json DELETED
@@ -1,22 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "module": "ESNext",
6
- "target": "ES2020",
7
- "jsx": "react-jsx",
8
- "lib": [
9
- "ES2020",
10
- "DOM",
11
- "DOM.Iterable"
12
- ]
13
- },
14
- "include": [
15
- "src/**/*"
16
- ],
17
- "exclude": [
18
- "node_modules",
19
- "dist",
20
- "**/*.test.ts"
21
- ]
22
- }