@lasterp/shared 1.0.0-beta.5 → 1.0.0-beta.6

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.
@@ -611,6 +611,19 @@ declare const useVariantSelector: <T extends {
611
611
  id: string;
612
612
  specs: Record<string, string>;
613
613
  }>(props: VariantSelectorProps<T>) => VariantSelectorResult;
614
+ import { JSX, ReactNode } from "react";
615
+ import { StateStorage } from "zustand/middleware";
616
+ type TranslateFn = (message: string, replace?: (string | number)[]) => string;
617
+ interface LocaleProviderProps {
618
+ method: string;
619
+ language: string;
620
+ storage?: StateStorage;
621
+ children: ReactNode;
622
+ }
623
+ declare function LocaleProvider({ method, language, storage, children }: LocaleProviderProps): JSX.Element | null;
624
+ declare function useLocale(): {
625
+ __: TranslateFn;
626
+ };
614
627
  interface Category {
615
628
  name: string;
616
629
  }
@@ -644,4 +657,4 @@ interface ProductContext {
644
657
  }
645
658
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
646
659
  declare function equalsIgnoreCase(str1: string, str2: string): boolean;
647
- export { useVariantSelector, useSearch, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
660
+ export { useVariantSelector, useSearch, useLocale, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, LocaleProvider, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
@@ -58,7 +58,7 @@ var FrappeProvider = ({
58
58
  children,
59
59
  customHeaders
60
60
  }) => {
61
- const frappeConfig = useMemo(() => {
61
+ const config = useMemo(() => {
62
62
  const frappe = new FrappeApp(url, tokenParams, undefined, customHeaders);
63
63
  return {
64
64
  url,
@@ -72,7 +72,7 @@ var FrappeProvider = ({
72
72
  };
73
73
  }, [url, tokenParams, enableSocket, socketPort, siteName, customHeaders]);
74
74
  return /* @__PURE__ */ jsx(FrappeContext.Provider, {
75
- value: frappeConfig,
75
+ value: config,
76
76
  children
77
77
  });
78
78
  };
@@ -570,6 +570,58 @@ var useVariantSelector = (props) => {
570
570
  getOptions: (key) => options[key] || []
571
571
  };
572
572
  };
573
+ // src/locale/provider.tsx
574
+ import {
575
+ createContext as createContext2,
576
+ useCallback as useCallback5,
577
+ useContext as useContext12,
578
+ useEffect as useEffect4,
579
+ useState as useState6
580
+ } from "react";
581
+ import { jsx as jsx2 } from "react/jsx-runtime";
582
+ function translate(message, replace, messages = {}) {
583
+ let translated = messages[message] ?? message;
584
+ replace?.forEach((val, i) => {
585
+ translated = translated.replace(`{${i}}`, String(val));
586
+ });
587
+ return translated;
588
+ }
589
+ var LocaleContext = createContext2((message) => message);
590
+ function LocaleProvider({
591
+ method,
592
+ language,
593
+ storage,
594
+ children
595
+ }) {
596
+ const [messages, setMessages] = useState6({});
597
+ useEffect4(() => {
598
+ if (!storage)
599
+ return;
600
+ const key = `locale:${language}`;
601
+ Promise.resolve(storage.getItem(key)).then((cached) => {
602
+ if (cached)
603
+ setMessages(JSON.parse(cached));
604
+ }).catch(() => {});
605
+ }, [language, storage]);
606
+ const { data, isLoading } = useFrappeGetCall(method, { language }, { staleTime: Infinity });
607
+ useEffect4(() => {
608
+ if (!data?.message)
609
+ return;
610
+ setMessages(data.message);
611
+ storage?.setItem(`locale:${language}`, JSON.stringify(data.message));
612
+ }, [data, language, storage]);
613
+ const __ = useCallback5((message, replace) => translate(message, replace, messages), [messages]);
614
+ if (isLoading && Object.keys(messages).length === 0)
615
+ return null;
616
+ return /* @__PURE__ */ jsx2(LocaleContext.Provider, {
617
+ value: __,
618
+ children
619
+ });
620
+ }
621
+ function useLocale() {
622
+ const __ = useContext12(LocaleContext);
623
+ return { __ };
624
+ }
573
625
  // src/utils/char.ts
574
626
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
575
627
  function equalsIgnoreCase(str1, str2) {
@@ -578,6 +630,7 @@ function equalsIgnoreCase(str1, str2) {
578
630
  export {
579
631
  useVariantSelector,
580
632
  useSearch,
633
+ useLocale,
581
634
  useFrappeUpdateDoc,
582
635
  useFrappePutCall,
583
636
  useFrappePrefetchDoc,
@@ -599,6 +652,7 @@ export {
599
652
  decamelize,
600
653
  camelizeKeys,
601
654
  camelize,
655
+ LocaleProvider,
602
656
  FrappeProvider,
603
657
  FrappeContext
604
658
  };
@@ -611,6 +611,19 @@ declare const useVariantSelector: <T extends {
611
611
  id: string;
612
612
  specs: Record<string, string>;
613
613
  }>(props: VariantSelectorProps<T>) => VariantSelectorResult;
614
+ import { JSX, ReactNode } from "react";
615
+ import { StateStorage } from "zustand/middleware";
616
+ type TranslateFn = (message: string, replace?: (string | number)[]) => string;
617
+ interface LocaleProviderProps {
618
+ method: string;
619
+ language: string;
620
+ storage?: StateStorage;
621
+ children: ReactNode;
622
+ }
623
+ declare function LocaleProvider({ method, language, storage, children }: LocaleProviderProps): JSX.Element | null;
624
+ declare function useLocale(): {
625
+ __: TranslateFn;
626
+ };
614
627
  interface Category {
615
628
  name: string;
616
629
  }
@@ -644,4 +657,4 @@ interface ProductContext {
644
657
  }
645
658
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
646
659
  declare function equalsIgnoreCase(str1: string, str2: string): boolean;
647
- export { useVariantSelector, useSearch, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
660
+ export { useVariantSelector, useSearch, useLocale, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, LocaleProvider, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
package/dist/rn/index.js CHANGED
@@ -58,7 +58,7 @@ var FrappeProvider = ({
58
58
  children,
59
59
  customHeaders
60
60
  }) => {
61
- const frappeConfig = useMemo(() => {
61
+ const config = useMemo(() => {
62
62
  const frappe = new FrappeApp(url, tokenParams, undefined, customHeaders);
63
63
  return {
64
64
  url,
@@ -72,7 +72,7 @@ var FrappeProvider = ({
72
72
  };
73
73
  }, [url, tokenParams, enableSocket, socketPort, siteName, customHeaders]);
74
74
  return /* @__PURE__ */ jsx(FrappeContext.Provider, {
75
- value: frappeConfig,
75
+ value: config,
76
76
  children
77
77
  });
78
78
  };
@@ -570,6 +570,58 @@ var useVariantSelector = (props) => {
570
570
  getOptions: (key) => options[key] || []
571
571
  };
572
572
  };
573
+ // src/locale/provider.tsx
574
+ import {
575
+ createContext as createContext2,
576
+ useCallback as useCallback5,
577
+ useContext as useContext12,
578
+ useEffect as useEffect4,
579
+ useState as useState6
580
+ } from "react";
581
+ import { jsx as jsx2 } from "react/jsx-runtime";
582
+ function translate(message, replace, messages = {}) {
583
+ let translated = messages[message] ?? message;
584
+ replace?.forEach((val, i) => {
585
+ translated = translated.replace(`{${i}}`, String(val));
586
+ });
587
+ return translated;
588
+ }
589
+ var LocaleContext = createContext2((message) => message);
590
+ function LocaleProvider({
591
+ method,
592
+ language,
593
+ storage,
594
+ children
595
+ }) {
596
+ const [messages, setMessages] = useState6({});
597
+ useEffect4(() => {
598
+ if (!storage)
599
+ return;
600
+ const key = `locale:${language}`;
601
+ Promise.resolve(storage.getItem(key)).then((cached) => {
602
+ if (cached)
603
+ setMessages(JSON.parse(cached));
604
+ }).catch(() => {});
605
+ }, [language, storage]);
606
+ const { data, isLoading } = useFrappeGetCall(method, { language }, { staleTime: Infinity });
607
+ useEffect4(() => {
608
+ if (!data?.message)
609
+ return;
610
+ setMessages(data.message);
611
+ storage?.setItem(`locale:${language}`, JSON.stringify(data.message));
612
+ }, [data, language, storage]);
613
+ const __ = useCallback5((message, replace) => translate(message, replace, messages), [messages]);
614
+ if (isLoading && Object.keys(messages).length === 0)
615
+ return null;
616
+ return /* @__PURE__ */ jsx2(LocaleContext.Provider, {
617
+ value: __,
618
+ children
619
+ });
620
+ }
621
+ function useLocale() {
622
+ const __ = useContext12(LocaleContext);
623
+ return { __ };
624
+ }
573
625
  // src/utils/char.ts
574
626
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
575
627
  function equalsIgnoreCase(str1, str2) {
@@ -578,6 +630,7 @@ function equalsIgnoreCase(str1, str2) {
578
630
  export {
579
631
  useVariantSelector,
580
632
  useSearch,
633
+ useLocale,
581
634
  useFrappeUpdateDoc,
582
635
  useFrappePutCall,
583
636
  useFrappePrefetchDoc,
@@ -599,6 +652,7 @@ export {
599
652
  decamelize,
600
653
  camelizeKeys,
601
654
  camelize,
655
+ LocaleProvider,
602
656
  FrappeProvider,
603
657
  FrappeContext
604
658
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lasterp/shared",
3
- "version": "1.0.0-beta.5",
3
+ "version": "1.0.0-beta.6",
4
4
  "description": "Shared repo for webapp and native app",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -20,10 +20,10 @@
20
20
  "typescript": "^5.9.3"
21
21
  },
22
22
  "peerDependencies": {
23
+ "@tanstack/react-query": "^5.90.21",
23
24
  "react": ">=18.0.0",
24
25
  "react-dom": ">=18.0.0",
25
- "typescript": ">=4.5.0",
26
- "@tanstack/react-query": "^5.90.21"
26
+ "typescript": ">=4.5.0"
27
27
  },
28
28
  "peerDependenciesMeta": {
29
29
  "typescript": {
@@ -44,6 +44,7 @@
44
44
  "dependencies": {
45
45
  "frappe-js-sdk": "^1.12.0",
46
46
  "humps": "^2.0.1",
47
- "socket.io-client": "^4.8.3"
47
+ "socket.io-client": "^4.8.3",
48
+ "zustand": "^5.0.11"
48
49
  }
49
50
  }