@alveole/components 1.3.1 → 1.3.2
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/core/AppUpdateProvider/AppUpdateProvider.d.ts.map +1 -1
- package/dist/core/AppUpdateProvider/AppUpdateProvider.js +8 -6
- package/dist/core/AppUpdateProvider/AppUpdateProvider.stories.d.ts +2 -39
- package/dist/core/AppUpdateProvider/AppUpdateProvider.stories.d.ts.map +1 -1
- package/dist/core/AppUpdateProvider/AppUpdateProvider.stories.js +63 -40
- package/dist/core/AppUpdateProvider/AppUpdateProvider.stories.sources.d.ts +0 -2
- package/dist/core/AppUpdateProvider/AppUpdateProvider.stories.sources.d.ts.map +1 -1
- package/dist/core/AppUpdateProvider/AppUpdateProvider.stories.sources.js +1 -4
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppUpdateProvider.d.ts","sourceRoot":"","sources":["../../../src/core/AppUpdateProvider/AppUpdateProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppUpdateProvider.d.ts","sourceRoot":"","sources":["../../../src/core/AppUpdateProvider/AppUpdateProvider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,KAAK,cAAc,GAAG;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAI9C,eAAO,MAAM,iBAAiB,QAAO,cAIpC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC,CAAC;AAOH,eAAO,MAAM,WAAW,QAAsB,CAAC;AAE/C,eAAO,MAAM,cAAc,GAAI,eAAe,MAAM,EAAE,KAAK,MAAM,KAAG,OAA6C,CAAC;AAclH,eAAO,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,sBA0E9D,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import * as Application from 'expo-application';
|
|
3
|
+
import Constants from 'expo-constants';
|
|
3
4
|
import { checkForUpdate, startUpdate } from 'expo-in-app-updates';
|
|
4
5
|
import React from 'react';
|
|
5
6
|
import { AppState, Linking, Platform } from 'react-native';
|
|
@@ -26,9 +27,10 @@ const reducer = (state, action) => {
|
|
|
26
27
|
};
|
|
27
28
|
export const AppUpdateProvider = (props) => {
|
|
28
29
|
const { children, title = DEFAULT_TITLE, description = DEFAULT_DESCRIPTION, buttonLabel = DEFAULT_BUTTON_LABEL, iosAppId, androidPackageId, } = props;
|
|
30
|
+
// expo-in-app-updates requires a real store client — skip in Expo Go and web
|
|
31
|
+
const isNativeStoreClient = Platform.OS !== 'web' && Constants.executionEnvironment !== 'storeClient';
|
|
29
32
|
const [{ isChecking, isUpdateRequired }, dispatch] = React.useReducer(reducer, {
|
|
30
|
-
|
|
31
|
-
isChecking: Platform.OS !== 'web',
|
|
33
|
+
isChecking: isNativeStoreClient,
|
|
32
34
|
isUpdateRequired: false,
|
|
33
35
|
});
|
|
34
36
|
const lastCheckedAt = React.useRef(0);
|
|
@@ -64,18 +66,18 @@ export const AppUpdateProvider = (props) => {
|
|
|
64
66
|
}
|
|
65
67
|
}, [dispatch]);
|
|
66
68
|
React.useEffect(() => {
|
|
67
|
-
if (
|
|
69
|
+
if (!isNativeStoreClient)
|
|
68
70
|
return;
|
|
69
71
|
runCheck(true);
|
|
70
|
-
}, [runCheck]);
|
|
72
|
+
}, [runCheck, isNativeStoreClient]);
|
|
71
73
|
React.useEffect(() => {
|
|
72
|
-
if (
|
|
74
|
+
if (!isNativeStoreClient)
|
|
73
75
|
return;
|
|
74
76
|
const subscription = AppState.addEventListener('change', state => {
|
|
75
77
|
if (state === 'active')
|
|
76
78
|
runCheck(false);
|
|
77
79
|
});
|
|
78
80
|
return () => subscription.remove();
|
|
79
|
-
}, [runCheck]);
|
|
81
|
+
}, [runCheck, isNativeStoreClient]);
|
|
80
82
|
return (_jsx(AppUpdateContext.Provider, { value: { isChecking }, children: !isChecking && isUpdateRequired ? (_jsx(UpdateRequired, { title: title, description: description, buttonLabel: buttonLabel, onUpdate: openStore })) : (children) }));
|
|
81
83
|
};
|
|
@@ -4,6 +4,7 @@ declare const _default: {
|
|
|
4
4
|
experimental: false;
|
|
5
5
|
description: string;
|
|
6
6
|
shortDescription: string;
|
|
7
|
+
figmaURL: string;
|
|
7
8
|
component: (props: import("./AppUpdateProvider").AppUpdateProviderProps) => import("react").JSX.Element;
|
|
8
9
|
styleFn: () => string;
|
|
9
10
|
};
|
|
@@ -12,46 +13,8 @@ export default _default;
|
|
|
12
13
|
* Rendu de l'écran affiché quand une mise à jour est disponible.
|
|
13
14
|
*
|
|
14
15
|
* En production, cet écran s'affiche automatiquement via `AppUpdateProvider`
|
|
15
|
-
* quand
|
|
16
|
+
* quand [expo-in-app-updates](https://github.com/SohelIslamImran/expo-in-app-updates) détecte une nouvelle version sur les stores.
|
|
16
17
|
*/
|
|
17
18
|
export declare const EcranMiseAJour: () => import("react").JSX.Element;
|
|
18
|
-
/**
|
|
19
|
-
* Intégration dans `app/_layout.tsx`, à placer à l'intérieur de `TranslationProvider`
|
|
20
|
-
* pour pouvoir surcharger les textes avec les traductions de l'app.
|
|
21
|
-
*
|
|
22
|
-
* - `iosAppId` : identifiant numérique App Store Connect (ex. `'6759812160'`), obligatoire.
|
|
23
|
-
* - `androidPackageId` : **ne pas passer** — récupéré automatiquement via `Application.applicationId` au runtime.
|
|
24
|
-
* - `title`, `description`, `buttonLabel` : optionnels, des valeurs françaises par défaut sont intégrées.
|
|
25
|
-
*
|
|
26
|
-
* ## Comportement par plateforme
|
|
27
|
-
*
|
|
28
|
-
* - **iOS** : affiche l'écran `UpdateRequired` avec un bouton qui ouvre l'App Store.
|
|
29
|
-
* - **Android** : déclenche automatiquement le flow de mise à jour immédiat du Play Store (`startUpdate(true)`).
|
|
30
|
-
* Si l'utilisateur annule ou si ça échoue, l'écran s'affiche en fallback.
|
|
31
|
-
* - **Web** : aucun blocage — `expo-in-app-updates` n'est pas supporté sur web.
|
|
32
|
-
*
|
|
33
|
-
* ## Throttle
|
|
34
|
-
*
|
|
35
|
-
* Le check est effectué au démarrage de l'app, puis à chaque retour en foreground,
|
|
36
|
-
* mais au maximum une fois toutes les 12h pour éviter des appels réseau inutiles.
|
|
37
|
-
*
|
|
38
|
-
* ```tsx
|
|
39
|
-
* // app/_layout.tsx
|
|
40
|
-
* const AppGate = () => {
|
|
41
|
-
* const { t } = useTranslation();
|
|
42
|
-
* return (
|
|
43
|
-
* <AppUpdateProvider
|
|
44
|
-
* iosAppId={constantExtras.IOS_STORE_ID ?? ''}
|
|
45
|
-
* title={t('screens.updateRequired.title')}
|
|
46
|
-
* description={t('screens.updateRequired.description')}
|
|
47
|
-
* buttonLabel={t('actions.update')}
|
|
48
|
-
* >
|
|
49
|
-
* <Slot />
|
|
50
|
-
* </AppUpdateProvider>
|
|
51
|
-
* );
|
|
52
|
-
* };
|
|
53
|
-
* ```
|
|
54
|
-
*/
|
|
55
|
-
export declare const Integration: () => null;
|
|
56
19
|
export * as Sources from './AppUpdateProvider.stories.sources';
|
|
57
20
|
//# sourceMappingURL=AppUpdateProvider.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppUpdateProvider.stories.d.ts","sourceRoot":"","sources":["../../../src/core/AppUpdateProvider/AppUpdateProvider.stories.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppUpdateProvider.stories.d.ts","sourceRoot":"","sources":["../../../src/core/AppUpdateProvider/AppUpdateProvider.stories.tsx"],"names":[],"mappings":";;;;;;;;;;AAiEA,wBAUkB;AAElB;;;;;GAKG;AACH,eAAO,MAAM,cAAc,mCAO1B,CAAC;AAEF,OAAO,KAAK,OAAO,MAAM,qCAAqC,CAAC"}
|
|
@@ -1,12 +1,73 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { UpdateRequired } from '../UpdateRequired';
|
|
3
3
|
import { AppUpdateProvider } from './AppUpdateProvider';
|
|
4
|
+
const description = [
|
|
5
|
+
"Bloque l'app et affiche un écran de mise à jour forcée quand une nouvelle version native est disponible sur les stores (App Store / Play Store).",
|
|
6
|
+
'',
|
|
7
|
+
'## Props',
|
|
8
|
+
'',
|
|
9
|
+
"- `iosAppId` : identifiant numérique App Store Connect (ex. `'6759812160'`), obligatoire.",
|
|
10
|
+
'- `androidPackageId` : **ne pas passer** — récupéré automatiquement via `Application.applicationId` au runtime.',
|
|
11
|
+
'- `title`, `description`, `buttonLabel` : optionnels, des valeurs françaises par défaut sont intégrées.',
|
|
12
|
+
'',
|
|
13
|
+
'## Comportement par plateforme',
|
|
14
|
+
'',
|
|
15
|
+
"- **iOS** : affiche l'écran `UpdateRequired` avec un bouton qui ouvre l'App Store.",
|
|
16
|
+
"- **Android** : déclenche automatiquement le flow de mise à jour immédiat du Play Store (`startUpdate(true)`). Si l'utilisateur annule ou si ça échoue, l'écran s'affiche en fallback.",
|
|
17
|
+
"- **Web** : aucun blocage — `expo-in-app-updates` n'est pas supporté sur web.",
|
|
18
|
+
'',
|
|
19
|
+
'## Throttle',
|
|
20
|
+
'',
|
|
21
|
+
"Le check est effectué au démarrage de l'app, puis à chaque retour en foreground, mais au maximum une fois toutes les 12h pour éviter des appels réseau inutiles.",
|
|
22
|
+
'',
|
|
23
|
+
'## Configuration de iosAppId',
|
|
24
|
+
'',
|
|
25
|
+
"L'iosAppId est l'identifiant numérique App Store Connect. Le configurer dans `app.config.js` pour différencier staging et production au moment du build :",
|
|
26
|
+
'',
|
|
27
|
+
'```js',
|
|
28
|
+
'// app.config.js',
|
|
29
|
+
"const isStaging = process.env.EXPO_PUBLIC_APP_ENV === 'staging';",
|
|
30
|
+
"const appStoreID = isStaging ? '<staging_id>' : '<production_id>';",
|
|
31
|
+
'',
|
|
32
|
+
'export default {',
|
|
33
|
+
' expo: {',
|
|
34
|
+
' extra: { IOS_STORE_ID: appStoreID },',
|
|
35
|
+
' },',
|
|
36
|
+
'};',
|
|
37
|
+
'```',
|
|
38
|
+
'',
|
|
39
|
+
'Puis dans `constants/ConstantExtra.ts` pour le lire à runtime :',
|
|
40
|
+
'',
|
|
41
|
+
'```ts',
|
|
42
|
+
'export const constantExtras = {',
|
|
43
|
+
' IOS_STORE_ID: Constants.expoConfig?.extra?.IOS_STORE_ID,',
|
|
44
|
+
'};',
|
|
45
|
+
'```',
|
|
46
|
+
'',
|
|
47
|
+
'```tsx',
|
|
48
|
+
'// app/_layout.tsx',
|
|
49
|
+
'const AppGate = () => {',
|
|
50
|
+
' const { t } = useTranslation();',
|
|
51
|
+
' return (',
|
|
52
|
+
' <AppUpdateProvider',
|
|
53
|
+
" iosAppId={constantExtras.IOS_STORE_ID ?? ''}",
|
|
54
|
+
" title={t('screens.updateRequired.title')}",
|
|
55
|
+
" description={t('screens.updateRequired.description')}",
|
|
56
|
+
" buttonLabel={t('actions.update')}",
|
|
57
|
+
' >',
|
|
58
|
+
' <Slot />',
|
|
59
|
+
' </AppUpdateProvider>',
|
|
60
|
+
' );',
|
|
61
|
+
'};',
|
|
62
|
+
'```',
|
|
63
|
+
].join('\n');
|
|
4
64
|
export default {
|
|
5
65
|
title: 'AppUpdateProvider',
|
|
6
66
|
tags: ['core'],
|
|
7
67
|
experimental: false,
|
|
8
|
-
description
|
|
68
|
+
description,
|
|
9
69
|
shortDescription: "Bloque l'app si une nouvelle version native est disponible.",
|
|
70
|
+
figmaURL: 'https://www.figma.com/design/xJz8Z6vfrnZPKTtRbuT2W8/Alveole---Composants?node-id=3341-46&t=NswBNb22DDDlXjp5-4',
|
|
10
71
|
component: AppUpdateProvider,
|
|
11
72
|
styleFn: () => 'Aucun style appliqué',
|
|
12
73
|
};
|
|
@@ -14,45 +75,7 @@ export default {
|
|
|
14
75
|
* Rendu de l'écran affiché quand une mise à jour est disponible.
|
|
15
76
|
*
|
|
16
77
|
* En production, cet écran s'affiche automatiquement via `AppUpdateProvider`
|
|
17
|
-
* quand
|
|
78
|
+
* quand [expo-in-app-updates](https://github.com/SohelIslamImran/expo-in-app-updates) détecte une nouvelle version sur les stores.
|
|
18
79
|
*/
|
|
19
80
|
export const EcranMiseAJour = () => (_jsx(UpdateRequired, { title: "Une mise \u00E0 jour de l'application est n\u00E9cessaire.", description: "La version actuelle de votre application n'est plus valide. T\u00E9l\u00E9chargez la nouvelle version de l'application pour continuer.", buttonLabel: "Mettre \u00E0 jour", onUpdate: () => { } }));
|
|
20
|
-
/**
|
|
21
|
-
* Intégration dans `app/_layout.tsx`, à placer à l'intérieur de `TranslationProvider`
|
|
22
|
-
* pour pouvoir surcharger les textes avec les traductions de l'app.
|
|
23
|
-
*
|
|
24
|
-
* - `iosAppId` : identifiant numérique App Store Connect (ex. `'6759812160'`), obligatoire.
|
|
25
|
-
* - `androidPackageId` : **ne pas passer** — récupéré automatiquement via `Application.applicationId` au runtime.
|
|
26
|
-
* - `title`, `description`, `buttonLabel` : optionnels, des valeurs françaises par défaut sont intégrées.
|
|
27
|
-
*
|
|
28
|
-
* ## Comportement par plateforme
|
|
29
|
-
*
|
|
30
|
-
* - **iOS** : affiche l'écran `UpdateRequired` avec un bouton qui ouvre l'App Store.
|
|
31
|
-
* - **Android** : déclenche automatiquement le flow de mise à jour immédiat du Play Store (`startUpdate(true)`).
|
|
32
|
-
* Si l'utilisateur annule ou si ça échoue, l'écran s'affiche en fallback.
|
|
33
|
-
* - **Web** : aucun blocage — `expo-in-app-updates` n'est pas supporté sur web.
|
|
34
|
-
*
|
|
35
|
-
* ## Throttle
|
|
36
|
-
*
|
|
37
|
-
* Le check est effectué au démarrage de l'app, puis à chaque retour en foreground,
|
|
38
|
-
* mais au maximum une fois toutes les 12h pour éviter des appels réseau inutiles.
|
|
39
|
-
*
|
|
40
|
-
* ```tsx
|
|
41
|
-
* // app/_layout.tsx
|
|
42
|
-
* const AppGate = () => {
|
|
43
|
-
* const { t } = useTranslation();
|
|
44
|
-
* return (
|
|
45
|
-
* <AppUpdateProvider
|
|
46
|
-
* iosAppId={constantExtras.IOS_STORE_ID ?? ''}
|
|
47
|
-
* title={t('screens.updateRequired.title')}
|
|
48
|
-
* description={t('screens.updateRequired.description')}
|
|
49
|
-
* buttonLabel={t('actions.update')}
|
|
50
|
-
* >
|
|
51
|
-
* <Slot />
|
|
52
|
-
* </AppUpdateProvider>
|
|
53
|
-
* );
|
|
54
|
-
* };
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
export const Integration = () => null;
|
|
58
81
|
export * as Sources from './AppUpdateProvider.stories.sources';
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
export declare const EcranMiseAJour: () => string;
|
|
2
|
-
export declare const Integration: () => string;
|
|
3
2
|
export declare const storySources: {
|
|
4
3
|
readonly EcranMiseAJour: () => string;
|
|
5
|
-
readonly Integration: () => string;
|
|
6
4
|
};
|
|
7
5
|
export type StorySourceName = keyof typeof storySources;
|
|
8
6
|
export declare const storyDescriptions: Partial<Record<StorySourceName, string>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppUpdateProvider.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/core/AppUpdateProvider/AppUpdateProvider.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,cAA2V,CAAC;AAEvX,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"AppUpdateProvider.stories.sources.d.ts","sourceRoot":"","sources":["../../../src/core/AppUpdateProvider/AppUpdateProvider.stories.sources.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,cAA2V,CAAC;AAEvX,eAAO,MAAM,YAAY;;CAEf,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAC;AAExD,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAEtE,CAAC"}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
// This file is generated. Do not edit manually.
|
|
2
2
|
// Source: src/core/AppUpdateProvider/AppUpdateProvider.stories.tsx
|
|
3
3
|
export const EcranMiseAJour = () => "export const EcranMiseAJour = () => (\n <UpdateRequired\n title=\"Une mise à jour de l'application est nécessaire.\"\n description=\"La version actuelle de votre application n'est plus valide. Téléchargez la nouvelle version de l'application pour continuer.\"\n buttonLabel=\"Mettre à jour\"\n onUpdate={() => {}}\n />\n);";
|
|
4
|
-
export const Integration = () => "export const Integration = () => null;";
|
|
5
4
|
export const storySources = {
|
|
6
5
|
EcranMiseAJour,
|
|
7
|
-
Integration,
|
|
8
6
|
};
|
|
9
7
|
export const storyDescriptions = {
|
|
10
|
-
EcranMiseAJour: "Rendu de l'écran affiché quand une mise à jour est disponible.\n\nEn production, cet écran s'affiche automatiquement via `AppUpdateProvider`\nquand
|
|
11
|
-
Integration: "Intégration dans `app/_layout.tsx`, à placer à l'intérieur de `TranslationProvider`\npour pouvoir surcharger les textes avec les traductions de l'app.\n\n- `iosAppId` : identifiant numérique App Store Connect (ex. `'6759812160'`), obligatoire.\n- `androidPackageId` : **ne pas passer** — récupéré automatiquement via `Application.applicationId` au runtime.\n- `title`, `description`, `buttonLabel` : optionnels, des valeurs françaises par défaut sont intégrées.\n\n## Comportement par plateforme\n\n- **iOS** : affiche l'écran `UpdateRequired` avec un bouton qui ouvre l'App Store.\n- **Android** : déclenche automatiquement le flow de mise à jour immédiat du Play Store (`startUpdate(true)`).\n Si l'utilisateur annule ou si ça échoue, l'écran s'affiche en fallback.\n- **Web** : aucun blocage — `expo-in-app-updates` n'est pas supporté sur web.\n\n## Throttle\n\nLe check est effectué au démarrage de l'app, puis à chaque retour en foreground,\nmais au maximum une fois toutes les 12h pour éviter des appels réseau inutiles.\n\n```tsx\n// app/_layout.tsx\nconst AppGate = () => {\n const { t } = useTranslation();\n return (\n <AppUpdateProvider\n iosAppId={constantExtras.IOS_STORE_ID ?? ''}\n title={t('screens.updateRequired.title')}\n description={t('screens.updateRequired.description')}\n buttonLabel={t('actions.update')}\n >\n <Slot />\n </AppUpdateProvider>\n );\n};\n```",
|
|
8
|
+
EcranMiseAJour: "Rendu de l'écran affiché quand une mise à jour est disponible.\n\nEn production, cet écran s'affiche automatiquement via `AppUpdateProvider`\nquand [expo-in-app-updates](https://github.com/SohelIslamImran/expo-in-app-updates) détecte une nouvelle version sur les stores.",
|
|
12
9
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const ALVEOLE_COMPONENTS_VERSION: "1.3.
|
|
1
|
+
export declare const ALVEOLE_COMPONENTS_VERSION: "1.3.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const ALVEOLE_COMPONENTS_VERSION = "1.3.
|
|
1
|
+
export const ALVEOLE_COMPONENTS_VERSION = "1.3.2";
|