@creopse/react 0.0.17 → 0.0.19

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.
@@ -6974,6 +6974,7 @@ const useHelper = () => {
6974
6974
  const page = react.usePage();
6975
6975
  const { request } = useApi();
6976
6976
  const { apiBaseUrl, langKey } = useConfig();
6977
+ const config = React.useContext(ConfigContext);
6977
6978
  const currentRoutePath = React.useMemo(() => page.url, [page.url]);
6978
6979
  const resolveUrl = React.useCallback(
6979
6980
  (path) => {
@@ -7017,15 +7018,26 @@ const useHelper = () => {
7017
7018
  const getTranslation = React.useCallback(
7018
7019
  (data, lang2) => {
7019
7020
  let parsedData;
7020
- if (!lang2) lang2 = localStorage.getItem(langKey) || "en";
7021
+ let userLanguage = (
7022
+ // @ts-expect-error ignore
7023
+ (window.navigator.language || window.navigator.userLanguage)?.split(
7024
+ "-"
7025
+ )[0]
7026
+ );
7027
+ if (props.userData && props.userData.preferences && props.userData.preferences.locale) {
7028
+ userLanguage = props.userData.preferences.locale;
7029
+ }
7030
+ if (!lang2) {
7031
+ lang2 = localStorage.getItem(langKey) || userLanguage || props.appLocale || config?.locale || "en";
7032
+ }
7021
7033
  try {
7022
7034
  parsedData = JSON.parse(data);
7023
7035
  } catch (e) {
7024
7036
  parsedData = {};
7025
7037
  }
7026
- return parsedData ? parsedData[lang2.toUpperCase()] || parsedData[lang2] || parsedData["en"] || "" : "";
7038
+ return parsedData ? parsedData[lang2.toUpperCase()] || parsedData[lang2] || "" : "";
7027
7039
  },
7028
- [langKey]
7040
+ [config?.locale, langKey, props.appLocale, props.userData]
7029
7041
  );
7030
7042
  const tr = React.useCallback(
7031
7043
  (data, lang2) => {
@@ -7082,7 +7094,7 @@ const useHelper = () => {
7082
7094
  const languages = React.useMemo(
7083
7095
  () => [
7084
7096
  {
7085
- label: "French",
7097
+ label: "Français",
7086
7098
  value: "fr",
7087
7099
  flag: "flag:fr-1x1"
7088
7100
  },
@@ -6973,6 +6973,7 @@ const useHelper = () => {
6973
6973
  const page = usePage();
6974
6974
  const { request } = useApi();
6975
6975
  const { apiBaseUrl, langKey } = useConfig();
6976
+ const config = useContext(ConfigContext);
6976
6977
  const currentRoutePath = useMemo(() => page.url, [page.url]);
6977
6978
  const resolveUrl = useCallback(
6978
6979
  (path) => {
@@ -7016,15 +7017,26 @@ const useHelper = () => {
7016
7017
  const getTranslation = useCallback(
7017
7018
  (data, lang2) => {
7018
7019
  let parsedData;
7019
- if (!lang2) lang2 = localStorage.getItem(langKey) || "en";
7020
+ let userLanguage = (
7021
+ // @ts-expect-error ignore
7022
+ (window.navigator.language || window.navigator.userLanguage)?.split(
7023
+ "-"
7024
+ )[0]
7025
+ );
7026
+ if (props.userData && props.userData.preferences && props.userData.preferences.locale) {
7027
+ userLanguage = props.userData.preferences.locale;
7028
+ }
7029
+ if (!lang2) {
7030
+ lang2 = localStorage.getItem(langKey) || userLanguage || props.appLocale || config?.locale || "en";
7031
+ }
7020
7032
  try {
7021
7033
  parsedData = JSON.parse(data);
7022
7034
  } catch (e) {
7023
7035
  parsedData = {};
7024
7036
  }
7025
- return parsedData ? parsedData[lang2.toUpperCase()] || parsedData[lang2] || parsedData["en"] || "" : "";
7037
+ return parsedData ? parsedData[lang2.toUpperCase()] || parsedData[lang2] || "" : "";
7026
7038
  },
7027
- [langKey]
7039
+ [config?.locale, langKey, props.appLocale, props.userData]
7028
7040
  );
7029
7041
  const tr = useCallback(
7030
7042
  (data, lang2) => {
@@ -7081,7 +7093,7 @@ const useHelper = () => {
7081
7093
  const languages = useMemo(
7082
7094
  () => [
7083
7095
  {
7084
- label: "French",
7096
+ label: "Français",
7085
7097
  value: "fr",
7086
7098
  flag: "flag:fr-1x1"
7087
7099
  },
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const content = require("../content-yneKOQn5.cjs");
3
+ const content = require("../content-CGhgyzQQ.cjs");
4
4
  const React = require("react");
5
5
  const useNewsletter = () => {
6
6
  const { request } = content.useApi();
@@ -1,5 +1,5 @@
1
- import { e as useApi } from "../content-CfIj9nZq.js";
2
- import { f, a, u, b } from "../content-CfIj9nZq.js";
1
+ import { e as useApi } from "../content-j9XJsmqN.js";
2
+ import { f, a, u, b } from "../content-j9XJsmqN.js";
3
3
  import { useState, useCallback } from "react";
4
4
  const useNewsletter = () => {
5
5
  const { request } = useApi();
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const React = require("react");
4
- const content = require("./content-yneKOQn5.cjs");
4
+ const content = require("./content-CGhgyzQQ.cjs");
5
5
  const react = require("@inertiajs/react");
6
6
  const reactDom = require("react-dom");
7
7
  function _interopNamespaceDefault(e) {
@@ -349,8 +349,8 @@ class PropsManager {
349
349
  this.state = { props: initialProps };
350
350
  this.listeners = /* @__PURE__ */ new Set();
351
351
  }
352
- update(payload) {
353
- this.state.props = this.deepMerge(this.state.props, payload);
352
+ update(payload, strategy = "merge") {
353
+ this.state.props = strategy === "merge" ? this.deepMerge(this.state.props, payload) : this.deepOverride(this.state.props, payload);
354
354
  this.notify();
355
355
  }
356
356
  getState() {
@@ -384,6 +384,20 @@ class PropsManager {
384
384
  }
385
385
  return output;
386
386
  }
387
+ deepOverride(target, source) {
388
+ if (!this.isObject(source)) {
389
+ return source;
390
+ }
391
+ const output = { ...source };
392
+ if (this.isObject(target)) {
393
+ Object.keys(source).forEach((key) => {
394
+ if (this.isObject(source[key]) && this.isObject(target[key])) {
395
+ output[key] = this.deepOverride(target[key], source[key]);
396
+ }
397
+ });
398
+ }
399
+ return output;
400
+ }
387
401
  isObject(item) {
388
402
  return item && typeof item === "object" && !Array.isArray(item);
389
403
  }
@@ -8426,7 +8440,7 @@ function CreopseProvider({ children, options }) {
8426
8440
  React.useEffect(() => {
8427
8441
  if (options.router) {
8428
8442
  const handleNavigate = (event) => {
8429
- manager.update(event.detail.page.props);
8443
+ manager.sync(event.detail.page.props);
8430
8444
  };
8431
8445
  options.router.on("navigate", handleNavigate);
8432
8446
  } else {
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import React__default, { useState, useEffect, createContext, useRef, useLayoutEffect, useId, useContext, useInsertionEffect, useMemo, useCallback, Children, isValidElement, Fragment, createElement, forwardRef, Component } from "react";
3
- import { u as useHelper, a as useContent, b as useProps, P as PropsContext, R as ResolveSectionsContext, c as cloneDeep, s as slideToId, E as EditorMessageType, d as RouterContext, C as ConfigContext } from "./content-CfIj9nZq.js";
3
+ import { u as useHelper, a as useContent, b as useProps, P as PropsContext, R as ResolveSectionsContext, c as cloneDeep, s as slideToId, E as EditorMessageType, d as RouterContext, C as ConfigContext } from "./content-j9XJsmqN.js";
4
4
  import { router } from "@inertiajs/react";
5
5
  import { createPortal } from "react-dom";
6
6
  var jsxRuntime = { exports: {} };
@@ -331,8 +331,8 @@ class PropsManager {
331
331
  this.state = { props: initialProps };
332
332
  this.listeners = /* @__PURE__ */ new Set();
333
333
  }
334
- update(payload) {
335
- this.state.props = this.deepMerge(this.state.props, payload);
334
+ update(payload, strategy = "merge") {
335
+ this.state.props = strategy === "merge" ? this.deepMerge(this.state.props, payload) : this.deepOverride(this.state.props, payload);
336
336
  this.notify();
337
337
  }
338
338
  getState() {
@@ -366,6 +366,20 @@ class PropsManager {
366
366
  }
367
367
  return output;
368
368
  }
369
+ deepOverride(target, source) {
370
+ if (!this.isObject(source)) {
371
+ return source;
372
+ }
373
+ const output = { ...source };
374
+ if (this.isObject(target)) {
375
+ Object.keys(source).forEach((key) => {
376
+ if (this.isObject(source[key]) && this.isObject(target[key])) {
377
+ output[key] = this.deepOverride(target[key], source[key]);
378
+ }
379
+ });
380
+ }
381
+ return output;
382
+ }
369
383
  isObject(item) {
370
384
  return item && typeof item === "object" && !Array.isArray(item);
371
385
  }
@@ -8408,7 +8422,7 @@ function CreopseProvider({ children, options }) {
8408
8422
  useEffect(() => {
8409
8423
  if (options.router) {
8410
8424
  const handleNavigate = (event) => {
8411
- manager.update(event.detail.page.props);
8425
+ manager.sync(event.detail.page.props);
8412
8426
  };
8413
8427
  options.router.on("navigate", handleNavigate);
8414
8428
  } else {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@creopse/react",
3
3
  "description": "Creopse React Toolkit",
4
- "version": "0.0.17",
4
+ "version": "0.0.19",
5
5
  "private": false,
6
6
  "author": "Noé Gnanih <noegnanih@gmail.com>",
7
7
  "license": "MIT",
@@ -43,7 +43,7 @@
43
43
  "react-dom": "^19.1.0"
44
44
  },
45
45
  "dependencies": {
46
- "@creopse/utils": "^0.0.11",
46
+ "@creopse/utils": "^0.0.12",
47
47
  "@vueuse/core": "^14.1.0",
48
48
  "axios": "^1.13.2",
49
49
  "framer-motion": "^12.23.9",
@@ -3,7 +3,7 @@ declare class PropsManager<T extends Props = Props> {
3
3
  private state;
4
4
  private listeners;
5
5
  constructor(initialProps: T);
6
- update(payload: T): void;
6
+ update(payload: T, strategy?: 'merge' | 'override'): void;
7
7
  getState(): {
8
8
  props: T;
9
9
  };
@@ -11,6 +11,7 @@ declare class PropsManager<T extends Props = Props> {
11
11
  subscribe(callback: (props: T) => void): () => void;
12
12
  private notify;
13
13
  private deepMerge;
14
+ private deepOverride;
14
15
  private isObject;
15
16
  }
16
17
  export default PropsManager;
@@ -16,6 +16,8 @@ export declare const useConfig: () => {
16
16
  debug: boolean;
17
17
  appUrl: string;
18
18
  xApiKey: string;
19
+ locale: string;
20
+ fallbackLocale: string;
19
21
  encryptionKey: string;
20
22
  langKey: string;
21
23
  };
@@ -8,6 +8,8 @@ export interface PluginConfig {
8
8
  debug: boolean;
9
9
  appUrl: string;
10
10
  xApiKey: string;
11
+ locale: string;
12
+ fallbackLocale: string;
11
13
  encryptionKey: string;
12
14
  langKey: string;
13
15
  }