@unif/react-native-design 0.33.0 → 0.33.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/lib/module/components/ui/Avatar/Avatar.js +3 -3
- package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
- package/lib/module/components/ui/DrawerHeader/DrawerHeader.js +3 -3
- package/lib/module/components/ui/DrawerHeader/DrawerHeader.js.map +1 -1
- package/lib/module/components/ui/Thumbnail/Thumbnail.js +3 -3
- package/lib/module/components/ui/Thumbnail/Thumbnail.js.map +1 -1
- package/lib/module/components/ui/shared/ImageAttempt.js.map +1 -1
- package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js +6 -5
- package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js.map +1 -1
- package/lib/module/components/ui/shared/useImageSource.js +11 -0
- package/lib/module/components/ui/shared/useImageSource.js.map +1 -0
- package/lib/module/utils/imageSource.js +47 -13
- package/lib/module/utils/imageSource.js.map +1 -1
- package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts +3 -2
- package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts +3 -2
- package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/shared/useImageSource.d.ts +6 -0
- package/lib/typescript/src/components/ui/shared/useImageSource.d.ts.map +1 -0
- package/lib/typescript/src/utils/imageSource.d.ts +3 -2
- package/lib/typescript/src/utils/imageSource.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/ui/Avatar/Avatar.tsx +3 -3
- package/src/components/ui/DrawerHeader/DrawerHeader.tsx +3 -3
- package/src/components/ui/Thumbnail/Thumbnail.tsx +3 -3
- package/src/components/ui/shared/ImageAttempt.tsx +3 -2
- package/src/components/ui/shared/selectImageAttemptSource.shared.ts +7 -5
- package/src/components/ui/shared/useImageSource.ts +8 -0
- package/src/utils/imageSource.ts +78 -15
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { Text, View } from 'react-native';
|
|
5
5
|
import { scaleFontMetric, useColors, useFontScale } from "../../../theme/index.js";
|
|
6
|
-
import {
|
|
6
|
+
import { useImageSource } from "../shared/useImageSource.js";
|
|
7
7
|
import { ImageAttempt } from "../shared/ImageAttempt.js";
|
|
8
8
|
import { paletteFor, styles } from "./styles.js";
|
|
9
9
|
import { resolveAvatarBorderRadius, sizingFor } from "./geometry.js";
|
|
@@ -28,7 +28,7 @@ export function Avatar({
|
|
|
28
28
|
const dims = sizingFor(size);
|
|
29
29
|
const palette = paletteFor(variant, c);
|
|
30
30
|
const labelFontSize = scaleFontMetric(dims.fs, fontScale);
|
|
31
|
-
const resolvedSource =
|
|
31
|
+
const resolvedSource = useImageSource(source);
|
|
32
32
|
const fallback = /*#__PURE__*/_jsx(Text, {
|
|
33
33
|
style: [styles.label, {
|
|
34
34
|
fontSize: labelFontSize,
|
|
@@ -48,7 +48,7 @@ export function Avatar({
|
|
|
48
48
|
accessibilityLabel: label,
|
|
49
49
|
testID: testID,
|
|
50
50
|
children: resolvedSource === undefined ? fallback : /*#__PURE__*/_jsx(ImageAttempt, {
|
|
51
|
-
source: resolvedSource
|
|
51
|
+
source: resolvedSource,
|
|
52
52
|
fallback: fallback,
|
|
53
53
|
style: styles.image,
|
|
54
54
|
resizeMode: "cover"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Text","View","scaleFontMetric","useColors","useFontScale","
|
|
1
|
+
{"version":3,"names":["React","Text","View","scaleFontMetric","useColors","useFontScale","useImageSource","ImageAttempt","paletteFor","styles","resolveAvatarBorderRadius","sizingFor","jsx","_jsx","Avatar","label","size","shape","variant","source","style","testID","c","fontScale","dims","palette","labelFontSize","fs","resolvedSource","fallback","fontSize","color","fg","numberOfLines","children","base","width","box","height","borderRadius","backgroundColor","bg","accessible","accessibilityLabel","undefined","image","resizeMode","key"],"sourceRoot":"../../../../../src","sources":["components/ui/Avatar/Avatar.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACzC,SAASC,eAAe,EAAEC,SAAS,EAAEC,YAAY,QAAQ,yBAAgB;AACzE,SAASC,cAAc,QAAQ,6BAA0B;AACzD,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,UAAU,EAAEC,MAAM,QAAQ,aAAU;AAC7C,SAASC,yBAAyB,EAAEC,SAAS,QAAQ,eAAY;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGlE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAAC;EACrBC,KAAK;EACLC,IAAI,GAAG,IAAI;EACXC,KAAK,GAAG,QAAQ;EAChBC,OAAO,GAAG,SAAS;EACnBC,MAAM;EACNC,KAAK;EACLC;AACW,CAAC,EAAqB;EACjC,MAAMC,CAAC,GAAGlB,SAAS,CAAC,CAAC;EACrB,MAAMmB,SAAS,GAAGlB,YAAY,CAAC,CAAC;EAChC,MAAMmB,IAAI,GAAGb,SAAS,CAACK,IAAI,CAAC;EAC5B,MAAMS,OAAO,GAAGjB,UAAU,CAACU,OAAO,EAAEI,CAAC,CAAC;EACtC,MAAMI,aAAa,GAAGvB,eAAe,CAACqB,IAAI,CAACG,EAAE,EAAEJ,SAAS,CAAC;EACzD,MAAMK,cAAc,GAAGtB,cAAc,CAACa,MAAM,CAAC;EAC7C,MAAMU,QAAQ,gBACZhB,IAAA,CAACZ,IAAI;IACHmB,KAAK,EAAE,CAACX,MAAM,CAACM,KAAK,EAAE;MAAEe,QAAQ,EAAEJ,aAAa;MAAEK,KAAK,EAAEN,OAAO,CAACO;IAAG,CAAC,CAAE;IACtEC,aAAa,EAAE,CAAE;IAAAC,QAAA,EAEhBnB;EAAK,CACF,CACP;EAED,oBACEF,IAAA,CAACX,IAAI;IACHkB,KAAK,EAAE,CACLX,MAAM,CAAC0B,IAAI,EACX;MACEC,KAAK,EAAEZ,IAAI,CAACa,GAAG;MACfC,MAAM,EAAEd,IAAI,CAACa,GAAG;MAChBE,YAAY,EAAE7B,yBAAyB,CAACM,IAAI,EAAEC,KAAK,CAAC;MACpDuB,eAAe,EAAEf,OAAO,CAACgB;IAC3B,CAAC,EACDrB,KAAK,CACL;IACFsB,UAAU,EAAE,CAAC,CAAC3B,KAAM;IACpB4B,kBAAkB,EAAE5B,KAAM;IAC1BM,MAAM,EAAEA,MAAO;IAAAa,QAAA,EAEdN,cAAc,KAAKgB,SAAS,GAC3Bf,QAAQ,gBAERhB,IAAA,CAACN,YAAY;MAEXY,MAAM,EAAES,cAAe;MACvBC,QAAQ,EAAEA,QAAS;MACnBT,KAAK,EAAEX,MAAM,CAACoC,KAAM;MACpBC,UAAU,EAAC;IAAO,GAJblB,cAAc,CAACmB,GAKrB;EACF,CACG,CAAC;AAEX","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { Text, View } from 'react-native';
|
|
5
5
|
import { useThemedStyles } from "../../../theme/index.js";
|
|
6
|
-
import {
|
|
6
|
+
import { useImageSource } from "../shared/useImageSource.js";
|
|
7
7
|
import { A11Y_HIDDEN_PROPS } from "../shared/a11y.js";
|
|
8
8
|
import { ImageAttempt } from "../shared/ImageAttempt.js";
|
|
9
9
|
import { makeStyles } from "./styles.js";
|
|
@@ -22,7 +22,7 @@ export function DrawerHeader({
|
|
|
22
22
|
const styles = useThemedStyles(makeStyles);
|
|
23
23
|
// [L-51] 码点级取首字,防 emoji / 代理对被截断为乱码。
|
|
24
24
|
const initial = [...name.trim()][0] ?? '?';
|
|
25
|
-
const resolvedSource =
|
|
25
|
+
const resolvedSource = useImageSource(source);
|
|
26
26
|
const fallback = /*#__PURE__*/_jsx(Text, {
|
|
27
27
|
style: styles.avatarText,
|
|
28
28
|
children: initial
|
|
@@ -34,7 +34,7 @@ export function DrawerHeader({
|
|
|
34
34
|
...A11Y_HIDDEN_PROPS,
|
|
35
35
|
style: [styles.avatar, resolvedSource !== undefined && styles.avatarImageMode],
|
|
36
36
|
children: resolvedSource === undefined ? fallback : /*#__PURE__*/_jsx(ImageAttempt, {
|
|
37
|
-
source: resolvedSource
|
|
37
|
+
source: resolvedSource,
|
|
38
38
|
fallback: fallback,
|
|
39
39
|
style: styles.avatarImage,
|
|
40
40
|
resizeMode: "cover"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Text","View","useThemedStyles","
|
|
1
|
+
{"version":3,"names":["React","Text","View","useThemedStyles","useImageSource","A11Y_HIDDEN_PROPS","ImageAttempt","makeStyles","jsx","_jsx","jsxs","_jsxs","DrawerHeader","name","subtitle","source","style","testID","styles","initial","trim","resolvedSource","fallback","avatarText","children","header","avatar","undefined","avatarImageMode","avatarImage","resizeMode","key","numberOfLines"],"sourceRoot":"../../../../../src","sources":["components/ui/DrawerHeader/DrawerHeader.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACzC,SAASC,eAAe,QAAQ,yBAAgB;AAChD,SAASC,cAAc,QAAQ,6BAA0B;AACzD,SAASC,iBAAiB,QAAQ,mBAAgB;AAClD,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,UAAU,QAAQ,aAAU;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAGtC;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,IAAI;EACJC,QAAQ;EACRC,MAAM;EACNC,KAAK;EACLC;AACiB,CAAC,EAAqB;EACvC,MAAMC,MAAM,GAAGf,eAAe,CAACI,UAAU,CAAC;EAC1C;EACA,MAAMY,OAAO,GAAG,CAAC,GAAGN,IAAI,CAACO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;EAC1C,MAAMC,cAAc,GAAGjB,cAAc,CAACW,MAAM,CAAC;EAC7C,MAAMO,QAAQ,gBAAGb,IAAA,CAACR,IAAI;IAACe,KAAK,EAAEE,MAAM,CAACK,UAAW;IAAAC,QAAA,EAAEL;EAAO,CAAO,CAAC;EAEjE,oBACER,KAAA,CAACT,IAAI;IAACc,KAAK,EAAE,CAACE,MAAM,CAACO,MAAM,EAAET,KAAK,CAAE;IAACC,MAAM,EAAEA,MAAO;IAAAO,QAAA,gBAClDf,IAAA,CAACP,IAAI;MAAA,GACCG,iBAAiB;MACrBW,KAAK,EAAE,CACLE,MAAM,CAACQ,MAAM,EACbL,cAAc,KAAKM,SAAS,IAAIT,MAAM,CAACU,eAAe,CACtD;MAAAJ,QAAA,EAEDH,cAAc,KAAKM,SAAS,GAC3BL,QAAQ,gBAERb,IAAA,CAACH,YAAY;QAEXS,MAAM,EAAEM,cAAe;QACvBC,QAAQ,EAAEA,QAAS;QACnBN,KAAK,EAAEE,MAAM,CAACW,WAAY;QAC1BC,UAAU,EAAC;MAAO,GAJbT,cAAc,CAACU,GAKrB;IACF,CACG,CAAC,eACPtB,IAAA,CAACR,IAAI;MAACe,KAAK,EAAEE,MAAM,CAACL,IAAK;MAACmB,aAAa,EAAE,CAAE;MAAAR,QAAA,EACxCX;IAAI,CACD,CAAC,EACNC,QAAQ,gBACPL,IAAA,CAACR,IAAI;MAACe,KAAK,EAAEE,MAAM,CAACJ,QAAS;MAACkB,aAAa,EAAE,CAAE;MAAAR,QAAA,EAC5CV;IAAQ,CACL,CAAC,GACL,IAAI;EAAA,CACJ,CAAC;AAEX","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import React, { useEffect, createElement as _createElement } from 'react';
|
|
4
4
|
import { StyleSheet, View } from 'react-native';
|
|
5
5
|
import { useColors, useThemedStyles } from "../../../theme/index.js";
|
|
6
|
-
import {
|
|
6
|
+
import { useImageSource } from "../shared/useImageSource.js";
|
|
7
7
|
import { createLogger } from "../../../utils/logger/index.js";
|
|
8
8
|
import { ImageAttempt } from "../shared/ImageAttempt.js";
|
|
9
9
|
import { A11Y_HIDDEN_PROPS } from "../shared/a11y.js";
|
|
@@ -39,7 +39,7 @@ export function Thumbnail(props) {
|
|
|
39
39
|
const sourceCandidate = hasUri !== hasSource ? hasUri && typeof uri === 'string' ? {
|
|
40
40
|
uri: uri.trim()
|
|
41
41
|
} : source : undefined;
|
|
42
|
-
const resolvedSource =
|
|
42
|
+
const resolvedSource = useImageSource(sourceCandidate);
|
|
43
43
|
const sanitizedImageStyle = sanitizeThumbnailImageStyle(imageStyle);
|
|
44
44
|
const diagnostics = [...normalizedDimensions.diagnostics, ...(resolvedSource === undefined ? ['source'] : []), ...sanitizedImageStyle.diagnostics.map(field => field === 'style' ? 'imageStyle' : `imageStyle.${field}`)];
|
|
45
45
|
const diagnosticKey = diagnostics.join(',');
|
|
@@ -71,7 +71,7 @@ export function Thumbnail(props) {
|
|
|
71
71
|
children: [resolvedSource === undefined ? fallbackContent : /*#__PURE__*/_createElement(ImageAttempt, {
|
|
72
72
|
...imageAccessibilityProps,
|
|
73
73
|
key: resolvedSource.key,
|
|
74
|
-
source: resolvedSource
|
|
74
|
+
source: resolvedSource,
|
|
75
75
|
fallback: fallbackContent,
|
|
76
76
|
style: [sanitizedImageStyle.style, StyleSheet.absoluteFill],
|
|
77
77
|
resizeMode: resizeMode
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","createElement","_createElement","StyleSheet","View","useColors","useThemedStyles","
|
|
1
|
+
{"version":3,"names":["React","useEffect","createElement","_createElement","StyleSheet","View","useColors","useThemedStyles","useImageSource","createLogger","ImageAttempt","A11Y_HIDDEN_PROPS","normalizeThumbnailDimensions","sanitizeThumbnailImageStyle","makeStyles","jsx","_jsx","jsxs","_jsxs","log","hasOwn","value","key","Object","prototype","hasOwnProperty","call","Thumbnail","props","uri","source","size","fallback","selected","containerStyle","imageStyle","resizeMode","accessibilityLabel","testID","colors","styles","normalizedDimensions","dim","dimensions","hasUri","hasSource","sourceCandidate","trim","undefined","resolvedSource","sanitizedImageStyle","diagnostics","map","field","diagnosticKey","join","__DEV__","length","warn","normalizedLabel","imageAccessibilityProps","accessible","accessibilityRole","ringStyle","borderRadius","borderColor","primary","fallbackContent","style","children","visualFrame","absoluteFill","pointerEvents","ring"],"sourceRoot":"../../../../../src","sources":["components/ui/Thumbnail/Thumbnail.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useState","Image","selectImageAttemptSource","Fragment","_Fragment","jsx","_jsx","ImageAttempt","source","fallback","imageProps","failed","setFailed","handleError","selectedSource","undefined","children","onError"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/ImageAttempt.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,KAAK,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["React","useCallback","useState","Image","selectImageAttemptSource","Fragment","_Fragment","jsx","_jsx","ImageAttempt","source","fallback","imageProps","failed","setFailed","handleError","selectedSource","undefined","children","onError"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/ImageAttempt.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,KAAK,QAAQ,cAAc;AAGpC,SAASC,wBAAwB,QAAQ,4BAA4B;AAAC,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AAOtE;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,MAAM;EACNC,QAAQ;EACR,GAAGC;AACc,CAAC,EAAqB;EACvC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGZ,QAAQ,CAAC,KAAK,CAAC;EAC3C;EACA,MAAMa,WAAW,GAAGd,WAAW,CAAC,MAAMa,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;EAC1D,MAAME,cAAc,GAAGZ,wBAAwB,CAACM,MAAM,CAAC;EAEvD,OAAOG,MAAM,IAAIG,cAAc,KAAKC,SAAS,gBAC3CT,IAAA,CAAAF,SAAA;IAAAY,QAAA,EAAGP;EAAQ,CAAG,CAAC,gBAEfH,IAAA,CAACL,KAAK;IAAA,GAAKS,UAAU;IAAEF,MAAM,EAAEM,cAAe;IAACG,OAAO,EAAEJ;EAAY,CAAE,CACvE;AACH","ignoreList":[]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
// Input validation belongs to the media component's resolver. Its frozen result
|
|
4
|
+
// is safe to select here without reading or serializing the original input again.
|
|
5
|
+
export function selectNativeImageAttemptSource(resolved) {
|
|
6
|
+
return resolved?.source;
|
|
6
7
|
}
|
|
7
|
-
export function selectWebImageAttemptSource(
|
|
8
|
-
|
|
8
|
+
export function selectWebImageAttemptSource(resolved) {
|
|
9
|
+
const source = resolved?.source;
|
|
9
10
|
|
|
10
11
|
// RNW 0.21 不解析 native 的 candidate 数组;Web 明确使用第一候选项。
|
|
11
12
|
return Array.isArray(source) ? source[0] : source;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["selectNativeImageAttemptSource","resolved","source","selectWebImageAttemptSource","Array","isArray"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/selectImageAttemptSource.shared.ts"],"mappings":";;AAGA;AACA;AACA,OAAO,SAASA,8BAA8BA,CAC5CC,QAAyC,EACR;EACjC,OAAOA,QAAQ,EAAEC,MAAM;AACzB;AAEA,OAAO,SAASC,2BAA2BA,CACzCF,QAAyC,EACR;EACjC,MAAMC,MAAM,GAAGD,QAAQ,EAAEC,MAAM;;EAE/B;EACA,OAAOE,KAAK,CAACC,OAAO,CAACH,MAAM,CAAC,GAAGA,MAAM,CAAC,CAAC,CAAC,GAAGA,MAAM;AACnD","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { createImageSourceResolver } from "../../../utils/imageSource.js";
|
|
5
|
+
|
|
6
|
+
/** Reuse immutable image inputs without retaining a global source cache. */
|
|
7
|
+
export function useImageSource(source) {
|
|
8
|
+
const resolve = useMemo(createImageSourceResolver, []);
|
|
9
|
+
return resolve(source);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=useImageSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","createImageSourceResolver","useImageSource","source","resolve"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/useImageSource.ts"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,yBAAyB,QAAQ,+BAA4B;;AAEtE;AACA,OAAO,SAASC,cAAcA,CAACC,MAAe,EAAE;EAC9C,MAAMC,OAAO,GAAGJ,OAAO,CAACC,yBAAyB,EAAE,EAAE,CAAC;EACtD,OAAOG,OAAO,CAACD,MAAM,CAAC;AACxB","ignoreList":[]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
const hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4
|
-
function valid(snapshot, canonical) {
|
|
4
|
+
function valid(snapshot, canonical, children) {
|
|
5
5
|
return {
|
|
6
6
|
valid: true,
|
|
7
7
|
snapshot,
|
|
8
|
-
canonical
|
|
8
|
+
canonical,
|
|
9
|
+
children
|
|
9
10
|
};
|
|
10
11
|
}
|
|
11
12
|
function invalid(kind) {
|
|
@@ -14,7 +15,7 @@ function invalid(kind) {
|
|
|
14
15
|
canonical: `invalid:${kind}`
|
|
15
16
|
};
|
|
16
17
|
}
|
|
17
|
-
function visitArray(value, keys, seen) {
|
|
18
|
+
function visitArray(value, keys, seen, previous) {
|
|
18
19
|
if (!keys.includes('length')) return invalid('descriptor');
|
|
19
20
|
const lengthDescriptor = Reflect.getOwnPropertyDescriptor(value, 'length');
|
|
20
21
|
if (lengthDescriptor === undefined || lengthDescriptor.enumerable || !hasOwn(lengthDescriptor, 'value') || typeof lengthDescriptor.value !== 'number' || !Number.isInteger(lengthDescriptor.value) || lengthDescriptor.value < 0) {
|
|
@@ -25,6 +26,9 @@ function visitArray(value, keys, seen) {
|
|
|
25
26
|
const keySet = new Set(keys);
|
|
26
27
|
const parts = [];
|
|
27
28
|
const snapshot = [];
|
|
29
|
+
const children = new Map();
|
|
30
|
+
const previousChildren = previous?.valid ? previous.children : undefined;
|
|
31
|
+
let unchanged = previous?.valid === true && Array.isArray(previous.snapshot) && previousChildren?.size === length;
|
|
28
32
|
let allValid = true;
|
|
29
33
|
for (let index = 0; index < length; index += 1) {
|
|
30
34
|
const key = String(index);
|
|
@@ -33,7 +37,10 @@ function visitArray(value, keys, seen) {
|
|
|
33
37
|
if (descriptor === undefined || !descriptor.enumerable || !hasOwn(descriptor, 'value')) {
|
|
34
38
|
return invalid('descriptor');
|
|
35
39
|
}
|
|
36
|
-
const
|
|
40
|
+
const priorItem = previousChildren?.get(key);
|
|
41
|
+
const item = visit(descriptor.value, seen, priorItem);
|
|
42
|
+
children.set(key, item);
|
|
43
|
+
unchanged = unchanged && item === priorItem;
|
|
37
44
|
parts.push(item.canonical);
|
|
38
45
|
if (item.valid) {
|
|
39
46
|
snapshot.push(item.snapshot);
|
|
@@ -41,22 +48,29 @@ function visitArray(value, keys, seen) {
|
|
|
41
48
|
allValid = false;
|
|
42
49
|
}
|
|
43
50
|
}
|
|
51
|
+
if (allValid && unchanged && previous?.valid) return previous;
|
|
44
52
|
const canonical = `array:[${parts.join(',')}]`;
|
|
45
|
-
return allValid ? valid(Object.freeze(snapshot), canonical) : {
|
|
53
|
+
return allValid ? valid(Object.freeze(snapshot), canonical, children) : {
|
|
46
54
|
valid: false,
|
|
47
55
|
canonical
|
|
48
56
|
};
|
|
49
57
|
}
|
|
50
|
-
function visitObject(value, keys, seen) {
|
|
58
|
+
function visitObject(value, keys, seen, previous) {
|
|
51
59
|
const snapshot = {};
|
|
52
60
|
const parts = [];
|
|
61
|
+
const children = new Map();
|
|
62
|
+
const previousChildren = previous?.valid ? previous.children : undefined;
|
|
63
|
+
let unchanged = previous?.valid === true && previous.snapshot !== null && typeof previous.snapshot === 'object' && !Array.isArray(previous.snapshot) && previousChildren?.size === keys.length;
|
|
53
64
|
let allValid = true;
|
|
54
65
|
for (const key of [...keys].sort()) {
|
|
55
66
|
const descriptor = Reflect.getOwnPropertyDescriptor(value, key);
|
|
56
67
|
if (descriptor === undefined) return invalid('descriptor');
|
|
57
68
|
if (!descriptor.enumerable) return invalid('non-enumerable');
|
|
58
69
|
if (!hasOwn(descriptor, 'value')) return invalid('accessor');
|
|
59
|
-
const
|
|
70
|
+
const priorItem = previousChildren?.get(key);
|
|
71
|
+
const item = visit(descriptor.value, seen, priorItem);
|
|
72
|
+
children.set(key, item);
|
|
73
|
+
unchanged = unchanged && item === priorItem;
|
|
60
74
|
parts.push(`${JSON.stringify(key)}:${item.canonical}`);
|
|
61
75
|
if (item.valid) {
|
|
62
76
|
Object.defineProperty(snapshot, key, {
|
|
@@ -69,8 +83,9 @@ function visitObject(value, keys, seen) {
|
|
|
69
83
|
allValid = false;
|
|
70
84
|
}
|
|
71
85
|
}
|
|
86
|
+
if (allValid && unchanged && previous?.valid) return previous;
|
|
72
87
|
const canonical = `object:{${parts.join(',')}}`;
|
|
73
|
-
return allValid ? valid(Object.freeze(snapshot), canonical) : {
|
|
88
|
+
return allValid ? valid(Object.freeze(snapshot), canonical, children) : {
|
|
74
89
|
valid: false,
|
|
75
90
|
canonical
|
|
76
91
|
};
|
|
@@ -80,7 +95,10 @@ function visitObject(value, keys, seen) {
|
|
|
80
95
|
* 只从 own data descriptor 读取一次,绝不执行 getter。snapshot 与 canonical
|
|
81
96
|
* key 因而来自同一份值;任何 descriptor / Proxy 异常都失败关闭。
|
|
82
97
|
*/
|
|
83
|
-
function visit(value, seen) {
|
|
98
|
+
function visit(value, seen, previous) {
|
|
99
|
+
// Objects are always re-read through their descriptors: callers can mutate
|
|
100
|
+
// an existing source or supply a Proxy. Only observed primitive values are reused.
|
|
101
|
+
if ((value === null || typeof value !== 'object') && previous?.valid && Object.is(previous.snapshot, value)) return previous;
|
|
84
102
|
if (value === undefined) return valid(undefined, 'undefined:');
|
|
85
103
|
if (value === null) return valid(null, 'null:');
|
|
86
104
|
switch (typeof value) {
|
|
@@ -110,7 +128,7 @@ function visit(value, seen) {
|
|
|
110
128
|
}
|
|
111
129
|
seen.add(value);
|
|
112
130
|
try {
|
|
113
|
-
return isArray ? visitArray(value, keys, seen) : visitObject(value, keys, seen);
|
|
131
|
+
return isArray ? visitArray(value, keys, seen, previous) : visitObject(value, keys, seen, previous);
|
|
114
132
|
} finally {
|
|
115
133
|
seen.delete(value);
|
|
116
134
|
}
|
|
@@ -118,9 +136,9 @@ function visit(value, seen) {
|
|
|
118
136
|
return invalid('exception');
|
|
119
137
|
}
|
|
120
138
|
}
|
|
121
|
-
function snapshotValue(value) {
|
|
139
|
+
function snapshotValue(value, previous) {
|
|
122
140
|
try {
|
|
123
|
-
return visit(value, new WeakSet());
|
|
141
|
+
return visit(value, new WeakSet(), previous);
|
|
124
142
|
} catch {
|
|
125
143
|
return invalid('exception');
|
|
126
144
|
}
|
|
@@ -174,7 +192,9 @@ function asImageSource(snapshot) {
|
|
|
174
192
|
* 与 semantic key。调用方必须把同一返回值里的 source / key 一起交给 attempt。
|
|
175
193
|
*/
|
|
176
194
|
export function resolveImageSource(source) {
|
|
177
|
-
|
|
195
|
+
return resolveSnapshot(snapshotValue(source));
|
|
196
|
+
}
|
|
197
|
+
function resolveSnapshot(result) {
|
|
178
198
|
if (!result.valid) return undefined;
|
|
179
199
|
const snapshot = asImageSource(result.snapshot);
|
|
180
200
|
if (snapshot === undefined) return undefined;
|
|
@@ -183,6 +203,20 @@ export function resolveImageSource(source) {
|
|
|
183
203
|
key: `image-source:${result.canonical}`
|
|
184
204
|
});
|
|
185
205
|
}
|
|
206
|
+
|
|
207
|
+
/** One resolver belongs to one mounted media component; only its latest tree is kept. */
|
|
208
|
+
export function createImageSourceResolver() {
|
|
209
|
+
let previous;
|
|
210
|
+
let resolved;
|
|
211
|
+
return source => {
|
|
212
|
+
const next = snapshotValue(source, previous);
|
|
213
|
+
if (next !== previous) {
|
|
214
|
+
resolved = resolveSnapshot(next);
|
|
215
|
+
previous = resolved === undefined ? undefined : next;
|
|
216
|
+
}
|
|
217
|
+
return resolved;
|
|
218
|
+
};
|
|
219
|
+
}
|
|
186
220
|
export function imageSourceKey(source) {
|
|
187
221
|
return `image-source:${snapshotValue(source).canonical}`;
|
|
188
222
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["hasOwn","value","key","Object","prototype","hasOwnProperty","call","valid","snapshot","canonical","invalid","kind","visitArray","keys","seen","includes","lengthDescriptor","Reflect","getOwnPropertyDescriptor","undefined","enumerable","Number","isInteger","length","keySet","Set","parts","allValid","index","String","has","descriptor","item","visit","push","join","freeze","visitObject","sort","JSON","stringify","defineProperty","configurable","writable","isFinite","isArray","Array","ownKeys","add","delete","snapshotValue","WeakSet","canonicalSourceValue","URI_STRING_FIELDS","CACHE_POLICIES","isSnapshotObject","isValidHeaders","every","isValidUriSource","uri","trim","field","fieldValue","headers","cache","asImageSource","resolveImageSource","source","result","imageSourceKey","isValidImageSource"],"sourceRoot":"../../../src","sources":["utils/imageSource.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["hasOwn","value","key","Object","prototype","hasOwnProperty","call","valid","snapshot","canonical","children","invalid","kind","visitArray","keys","seen","previous","includes","lengthDescriptor","Reflect","getOwnPropertyDescriptor","undefined","enumerable","Number","isInteger","length","keySet","Set","parts","Map","previousChildren","unchanged","Array","isArray","size","allValid","index","String","has","descriptor","priorItem","get","item","visit","set","push","join","freeze","visitObject","sort","JSON","stringify","defineProperty","configurable","writable","is","isFinite","ownKeys","add","delete","snapshotValue","WeakSet","canonicalSourceValue","URI_STRING_FIELDS","CACHE_POLICIES","isSnapshotObject","isValidHeaders","every","isValidUriSource","uri","trim","field","fieldValue","headers","cache","asImageSource","resolveImageSource","source","resolveSnapshot","result","createImageSourceResolver","resolved","next","imageSourceKey","isValidImageSource"],"sourceRoot":"../../../src","sources":["utils/imageSource.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { ImageProps
|
|
2
|
+
import type { ImageProps } from 'react-native';
|
|
3
|
+
import type { ResolvedImageSource } from '../../../utils/imageSource';
|
|
3
4
|
type ImageAttemptProps = Omit<ImageProps, 'onError' | 'source'> & {
|
|
4
|
-
source:
|
|
5
|
+
source: ResolvedImageSource;
|
|
5
6
|
fallback: React.ReactNode;
|
|
6
7
|
};
|
|
7
8
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageAttempt.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/ImageAttempt.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ImageAttempt.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/ImageAttempt.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,KAAK,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG;IAChE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,GAAG,UAAU,EACd,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAWvC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ImageSourcePropType } from 'react-native';
|
|
2
|
-
|
|
3
|
-
export declare function
|
|
2
|
+
import type { ResolvedImageSource } from '../../../utils/imageSource';
|
|
3
|
+
export declare function selectNativeImageAttemptSource(resolved: ResolvedImageSource | undefined): ImageSourcePropType | undefined;
|
|
4
|
+
export declare function selectWebImageAttemptSource(resolved: ResolvedImageSource | undefined): ImageSourcePropType | undefined;
|
|
4
5
|
//# sourceMappingURL=selectImageAttemptSource.shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectImageAttemptSource.shared.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/selectImageAttemptSource.shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"selectImageAttemptSource.shared.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/selectImageAttemptSource.shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAItE,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GACxC,mBAAmB,GAAG,SAAS,CAEjC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GACxC,mBAAmB,GAAG,SAAS,CAKjC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Reuse immutable image inputs without retaining a global source cache. */
|
|
2
|
+
export declare function useImageSource(source: unknown): Readonly<{
|
|
3
|
+
source: import("react-native").ImageSourcePropType;
|
|
4
|
+
key: string;
|
|
5
|
+
}> | undefined;
|
|
6
|
+
//# sourceMappingURL=useImageSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useImageSource.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/useImageSource.ts"],"names":[],"mappings":"AAGA,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO;;;eAG7C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ImageSourcePropType } from 'react-native';
|
|
2
|
-
type ResolvedImageSource = Readonly<{
|
|
2
|
+
export type ResolvedImageSource = Readonly<{
|
|
3
3
|
source: ImageSourcePropType;
|
|
4
4
|
key: string;
|
|
5
5
|
}>;
|
|
@@ -9,6 +9,8 @@ export declare function canonicalSourceValue(value: unknown): string;
|
|
|
9
9
|
* 与 semantic key。调用方必须把同一返回值里的 source / key 一起交给 attempt。
|
|
10
10
|
*/
|
|
11
11
|
export declare function resolveImageSource(source: unknown): ResolvedImageSource | undefined;
|
|
12
|
+
/** One resolver belongs to one mounted media component; only its latest tree is kept. */
|
|
13
|
+
export declare function createImageSourceResolver(): (source: unknown) => ResolvedImageSource | undefined;
|
|
12
14
|
export declare function imageSourceKey(source: ImageSourcePropType | undefined): string;
|
|
13
15
|
/**
|
|
14
16
|
* JS 消费者可能绕过类型系统。只有能安全 snapshot 的 asset id、URI object 或
|
|
@@ -16,5 +18,4 @@ export declare function imageSourceKey(source: ImageSourcePropType | undefined):
|
|
|
16
18
|
* 一律失败关闭。
|
|
17
19
|
*/
|
|
18
20
|
export declare function isValidImageSource(source: unknown): source is ImageSourcePropType;
|
|
19
|
-
export {};
|
|
20
21
|
//# sourceMappingURL=imageSource.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageSource.d.ts","sourceRoot":"","sources":["../../../../src/utils/imageSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"imageSource.d.ts","sourceRoot":"","sources":["../../../../src/utils/imageSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA6BxD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CAAC;AA6MH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE3D;AAyED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,GACd,mBAAmB,GAAG,SAAS,CAEjC;AAgBD,yFAAyF;AACzF,wBAAgB,yBAAyB,KAG/B,QAAQ,OAAO,KAAG,mBAAmB,GAAG,SAAS,CAQ1D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,mBAAmB,GAAG,SAAS,GACtC,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,mBAAmB,CAE/B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Text, View } from 'react-native';
|
|
3
3
|
import { scaleFontMetric, useColors, useFontScale } from '../../../theme';
|
|
4
|
-
import {
|
|
4
|
+
import { useImageSource } from '../shared/useImageSource';
|
|
5
5
|
import { ImageAttempt } from '../shared/ImageAttempt';
|
|
6
6
|
import { paletteFor, styles } from './styles';
|
|
7
7
|
import { resolveAvatarBorderRadius, sizingFor } from './geometry';
|
|
@@ -27,7 +27,7 @@ export function Avatar({
|
|
|
27
27
|
const dims = sizingFor(size);
|
|
28
28
|
const palette = paletteFor(variant, c);
|
|
29
29
|
const labelFontSize = scaleFontMetric(dims.fs, fontScale);
|
|
30
|
-
const resolvedSource =
|
|
30
|
+
const resolvedSource = useImageSource(source);
|
|
31
31
|
const fallback = (
|
|
32
32
|
<Text
|
|
33
33
|
style={[styles.label, { fontSize: labelFontSize, color: palette.fg }]}
|
|
@@ -58,7 +58,7 @@ export function Avatar({
|
|
|
58
58
|
) : (
|
|
59
59
|
<ImageAttempt
|
|
60
60
|
key={resolvedSource.key}
|
|
61
|
-
source={resolvedSource
|
|
61
|
+
source={resolvedSource}
|
|
62
62
|
fallback={fallback}
|
|
63
63
|
style={styles.image}
|
|
64
64
|
resizeMode="cover"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Text, View } from 'react-native';
|
|
3
3
|
import { useThemedStyles } from '../../../theme';
|
|
4
|
-
import {
|
|
4
|
+
import { useImageSource } from '../shared/useImageSource';
|
|
5
5
|
import { A11Y_HIDDEN_PROPS } from '../shared/a11y';
|
|
6
6
|
import { ImageAttempt } from '../shared/ImageAttempt';
|
|
7
7
|
import { makeStyles } from './styles';
|
|
@@ -21,7 +21,7 @@ export function DrawerHeader({
|
|
|
21
21
|
const styles = useThemedStyles(makeStyles);
|
|
22
22
|
// [L-51] 码点级取首字,防 emoji / 代理对被截断为乱码。
|
|
23
23
|
const initial = [...name.trim()][0] ?? '?';
|
|
24
|
-
const resolvedSource =
|
|
24
|
+
const resolvedSource = useImageSource(source);
|
|
25
25
|
const fallback = <Text style={styles.avatarText}>{initial}</Text>;
|
|
26
26
|
|
|
27
27
|
return (
|
|
@@ -38,7 +38,7 @@ export function DrawerHeader({
|
|
|
38
38
|
) : (
|
|
39
39
|
<ImageAttempt
|
|
40
40
|
key={resolvedSource.key}
|
|
41
|
-
source={resolvedSource
|
|
41
|
+
source={resolvedSource}
|
|
42
42
|
fallback={fallback}
|
|
43
43
|
style={styles.avatarImage}
|
|
44
44
|
resizeMode="cover"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useEffect } from 'react';
|
|
2
2
|
import { StyleSheet, View } from 'react-native';
|
|
3
3
|
import { useColors, useThemedStyles } from '../../../theme';
|
|
4
|
-
import {
|
|
4
|
+
import { useImageSource } from '../shared/useImageSource';
|
|
5
5
|
import { createLogger } from '../../../utils/logger';
|
|
6
6
|
import { ImageAttempt } from '../shared/ImageAttempt';
|
|
7
7
|
import { A11Y_HIDDEN_PROPS } from '../shared/a11y';
|
|
@@ -45,7 +45,7 @@ export function Thumbnail(props: ThumbnailProps): React.JSX.Element {
|
|
|
45
45
|
? { uri: uri.trim() }
|
|
46
46
|
: source
|
|
47
47
|
: undefined;
|
|
48
|
-
const resolvedSource =
|
|
48
|
+
const resolvedSource = useImageSource(sourceCandidate);
|
|
49
49
|
const sanitizedImageStyle = sanitizeThumbnailImageStyle(imageStyle);
|
|
50
50
|
const diagnostics = [
|
|
51
51
|
...normalizedDimensions.diagnostics,
|
|
@@ -94,7 +94,7 @@ export function Thumbnail(props: ThumbnailProps): React.JSX.Element {
|
|
|
94
94
|
<ImageAttempt
|
|
95
95
|
{...imageAccessibilityProps}
|
|
96
96
|
key={resolvedSource.key}
|
|
97
|
-
source={resolvedSource
|
|
97
|
+
source={resolvedSource}
|
|
98
98
|
fallback={fallbackContent}
|
|
99
99
|
style={[sanitizedImageStyle.style, StyleSheet.absoluteFill]}
|
|
100
100
|
resizeMode={resizeMode}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import React, { useCallback, useState } from 'react';
|
|
2
2
|
import { Image } from 'react-native';
|
|
3
|
-
import type { ImageProps
|
|
3
|
+
import type { ImageProps } from 'react-native';
|
|
4
|
+
import type { ResolvedImageSource } from '../../../utils/imageSource';
|
|
4
5
|
import { selectImageAttemptSource } from './selectImageAttemptSource';
|
|
5
6
|
|
|
6
7
|
type ImageAttemptProps = Omit<ImageProps, 'onError' | 'source'> & {
|
|
7
|
-
source:
|
|
8
|
+
source: ResolvedImageSource;
|
|
8
9
|
fallback: React.ReactNode;
|
|
9
10
|
};
|
|
10
11
|
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import type { ImageSourcePropType } from 'react-native';
|
|
2
|
-
import {
|
|
2
|
+
import type { ResolvedImageSource } from '../../../utils/imageSource';
|
|
3
3
|
|
|
4
|
+
// Input validation belongs to the media component's resolver. Its frozen result
|
|
5
|
+
// is safe to select here without reading or serializing the original input again.
|
|
4
6
|
export function selectNativeImageAttemptSource(
|
|
5
|
-
|
|
7
|
+
resolved: ResolvedImageSource | undefined
|
|
6
8
|
): ImageSourcePropType | undefined {
|
|
7
|
-
return
|
|
9
|
+
return resolved?.source;
|
|
8
10
|
}
|
|
9
11
|
|
|
10
12
|
export function selectWebImageAttemptSource(
|
|
11
|
-
|
|
13
|
+
resolved: ResolvedImageSource | undefined
|
|
12
14
|
): ImageSourcePropType | undefined {
|
|
13
|
-
|
|
15
|
+
const source = resolved?.source;
|
|
14
16
|
|
|
15
17
|
// RNW 0.21 不解析 native 的 candidate 数组;Web 明确使用第一候选项。
|
|
16
18
|
return Array.isArray(source) ? source[0] : source;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { createImageSourceResolver } from '../../../utils/imageSource';
|
|
3
|
+
|
|
4
|
+
/** Reuse immutable image inputs without retaining a global source cache. */
|
|
5
|
+
export function useImageSource(source: unknown) {
|
|
6
|
+
const resolve = useMemo(createImageSourceResolver, []);
|
|
7
|
+
return resolve(source);
|
|
8
|
+
}
|
package/src/utils/imageSource.ts
CHANGED
|
@@ -20,13 +20,14 @@ type SnapshotResult =
|
|
|
20
20
|
valid: true;
|
|
21
21
|
snapshot: SnapshotValue;
|
|
22
22
|
canonical: string;
|
|
23
|
+
children?: ReadonlyMap<string, SnapshotResult>;
|
|
23
24
|
}
|
|
24
25
|
| {
|
|
25
26
|
valid: false;
|
|
26
27
|
canonical: string;
|
|
27
28
|
};
|
|
28
29
|
|
|
29
|
-
type ResolvedImageSource = Readonly<{
|
|
30
|
+
export type ResolvedImageSource = Readonly<{
|
|
30
31
|
source: ImageSourcePropType;
|
|
31
32
|
key: string;
|
|
32
33
|
}>;
|
|
@@ -34,8 +35,12 @@ type ResolvedImageSource = Readonly<{
|
|
|
34
35
|
const hasOwn = (value: object, key: PropertyKey): boolean =>
|
|
35
36
|
Object.prototype.hasOwnProperty.call(value, key);
|
|
36
37
|
|
|
37
|
-
function valid(
|
|
38
|
-
|
|
38
|
+
function valid(
|
|
39
|
+
snapshot: SnapshotValue,
|
|
40
|
+
canonical: string,
|
|
41
|
+
children?: ReadonlyMap<string, SnapshotResult>
|
|
42
|
+
): SnapshotResult {
|
|
43
|
+
return { valid: true, snapshot, canonical, children };
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
function invalid(kind: string): SnapshotResult {
|
|
@@ -45,7 +50,8 @@ function invalid(kind: string): SnapshotResult {
|
|
|
45
50
|
function visitArray(
|
|
46
51
|
value: object,
|
|
47
52
|
keys: readonly string[],
|
|
48
|
-
seen: WeakSet<object
|
|
53
|
+
seen: WeakSet<object>,
|
|
54
|
+
previous?: SnapshotResult
|
|
49
55
|
): SnapshotResult {
|
|
50
56
|
if (!keys.includes('length')) return invalid('descriptor');
|
|
51
57
|
|
|
@@ -67,6 +73,12 @@ function visitArray(
|
|
|
67
73
|
const keySet = new Set(keys);
|
|
68
74
|
const parts: string[] = [];
|
|
69
75
|
const snapshot: SnapshotValue[] = [];
|
|
76
|
+
const children = new Map<string, SnapshotResult>();
|
|
77
|
+
const previousChildren = previous?.valid ? previous.children : undefined;
|
|
78
|
+
let unchanged =
|
|
79
|
+
previous?.valid === true &&
|
|
80
|
+
Array.isArray(previous.snapshot) &&
|
|
81
|
+
previousChildren?.size === length;
|
|
70
82
|
let allValid = true;
|
|
71
83
|
|
|
72
84
|
for (let index = 0; index < length; index += 1) {
|
|
@@ -82,7 +94,10 @@ function visitArray(
|
|
|
82
94
|
return invalid('descriptor');
|
|
83
95
|
}
|
|
84
96
|
|
|
85
|
-
const
|
|
97
|
+
const priorItem = previousChildren?.get(key);
|
|
98
|
+
const item = visit(descriptor.value, seen, priorItem);
|
|
99
|
+
children.set(key, item);
|
|
100
|
+
unchanged = unchanged && item === priorItem;
|
|
86
101
|
parts.push(item.canonical);
|
|
87
102
|
if (item.valid) {
|
|
88
103
|
snapshot.push(item.snapshot);
|
|
@@ -91,19 +106,29 @@ function visitArray(
|
|
|
91
106
|
}
|
|
92
107
|
}
|
|
93
108
|
|
|
109
|
+
if (allValid && unchanged && previous?.valid) return previous;
|
|
94
110
|
const canonical = `array:[${parts.join(',')}]`;
|
|
95
111
|
return allValid
|
|
96
|
-
? valid(Object.freeze(snapshot), canonical)
|
|
112
|
+
? valid(Object.freeze(snapshot), canonical, children)
|
|
97
113
|
: { valid: false, canonical };
|
|
98
114
|
}
|
|
99
115
|
|
|
100
116
|
function visitObject(
|
|
101
117
|
value: object,
|
|
102
118
|
keys: readonly string[],
|
|
103
|
-
seen: WeakSet<object
|
|
119
|
+
seen: WeakSet<object>,
|
|
120
|
+
previous?: SnapshotResult
|
|
104
121
|
): SnapshotResult {
|
|
105
122
|
const snapshot: Record<string, SnapshotValue> = {};
|
|
106
123
|
const parts: string[] = [];
|
|
124
|
+
const children = new Map<string, SnapshotResult>();
|
|
125
|
+
const previousChildren = previous?.valid ? previous.children : undefined;
|
|
126
|
+
let unchanged =
|
|
127
|
+
previous?.valid === true &&
|
|
128
|
+
previous.snapshot !== null &&
|
|
129
|
+
typeof previous.snapshot === 'object' &&
|
|
130
|
+
!Array.isArray(previous.snapshot) &&
|
|
131
|
+
previousChildren?.size === keys.length;
|
|
107
132
|
let allValid = true;
|
|
108
133
|
|
|
109
134
|
for (const key of [...keys].sort()) {
|
|
@@ -112,7 +137,10 @@ function visitObject(
|
|
|
112
137
|
if (!descriptor.enumerable) return invalid('non-enumerable');
|
|
113
138
|
if (!hasOwn(descriptor, 'value')) return invalid('accessor');
|
|
114
139
|
|
|
115
|
-
const
|
|
140
|
+
const priorItem = previousChildren?.get(key);
|
|
141
|
+
const item = visit(descriptor.value, seen, priorItem);
|
|
142
|
+
children.set(key, item);
|
|
143
|
+
unchanged = unchanged && item === priorItem;
|
|
116
144
|
parts.push(`${JSON.stringify(key)}:${item.canonical}`);
|
|
117
145
|
if (item.valid) {
|
|
118
146
|
Object.defineProperty(snapshot, key, {
|
|
@@ -126,9 +154,10 @@ function visitObject(
|
|
|
126
154
|
}
|
|
127
155
|
}
|
|
128
156
|
|
|
157
|
+
if (allValid && unchanged && previous?.valid) return previous;
|
|
129
158
|
const canonical = `object:{${parts.join(',')}}`;
|
|
130
159
|
return allValid
|
|
131
|
-
? valid(Object.freeze(snapshot), canonical)
|
|
160
|
+
? valid(Object.freeze(snapshot), canonical, children)
|
|
132
161
|
: { valid: false, canonical };
|
|
133
162
|
}
|
|
134
163
|
|
|
@@ -136,7 +165,19 @@ function visitObject(
|
|
|
136
165
|
* 只从 own data descriptor 读取一次,绝不执行 getter。snapshot 与 canonical
|
|
137
166
|
* key 因而来自同一份值;任何 descriptor / Proxy 异常都失败关闭。
|
|
138
167
|
*/
|
|
139
|
-
function visit(
|
|
168
|
+
function visit(
|
|
169
|
+
value: unknown,
|
|
170
|
+
seen: WeakSet<object>,
|
|
171
|
+
previous?: SnapshotResult
|
|
172
|
+
): SnapshotResult {
|
|
173
|
+
// Objects are always re-read through their descriptors: callers can mutate
|
|
174
|
+
// an existing source or supply a Proxy. Only observed primitive values are reused.
|
|
175
|
+
if (
|
|
176
|
+
(value === null || typeof value !== 'object') &&
|
|
177
|
+
previous?.valid &&
|
|
178
|
+
Object.is(previous.snapshot, value)
|
|
179
|
+
)
|
|
180
|
+
return previous;
|
|
140
181
|
if (value === undefined) return valid(undefined, 'undefined:');
|
|
141
182
|
if (value === null) return valid(null, 'null:');
|
|
142
183
|
|
|
@@ -173,8 +214,8 @@ function visit(value: unknown, seen: WeakSet<object>): SnapshotResult {
|
|
|
173
214
|
seen.add(value);
|
|
174
215
|
try {
|
|
175
216
|
return isArray
|
|
176
|
-
? visitArray(value, keys, seen)
|
|
177
|
-
: visitObject(value, keys, seen);
|
|
217
|
+
? visitArray(value, keys, seen, previous)
|
|
218
|
+
: visitObject(value, keys, seen, previous);
|
|
178
219
|
} finally {
|
|
179
220
|
seen.delete(value);
|
|
180
221
|
}
|
|
@@ -183,9 +224,12 @@ function visit(value: unknown, seen: WeakSet<object>): SnapshotResult {
|
|
|
183
224
|
}
|
|
184
225
|
}
|
|
185
226
|
|
|
186
|
-
function snapshotValue(
|
|
227
|
+
function snapshotValue(
|
|
228
|
+
value: unknown,
|
|
229
|
+
previous?: SnapshotResult
|
|
230
|
+
): SnapshotResult {
|
|
187
231
|
try {
|
|
188
|
-
return visit(value, new WeakSet<object>());
|
|
232
|
+
return visit(value, new WeakSet<object>(), previous);
|
|
189
233
|
} catch {
|
|
190
234
|
return invalid('exception');
|
|
191
235
|
}
|
|
@@ -273,7 +317,12 @@ function asImageSource(
|
|
|
273
317
|
export function resolveImageSource(
|
|
274
318
|
source: unknown
|
|
275
319
|
): ResolvedImageSource | undefined {
|
|
276
|
-
|
|
320
|
+
return resolveSnapshot(snapshotValue(source));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
function resolveSnapshot(
|
|
324
|
+
result: SnapshotResult
|
|
325
|
+
): ResolvedImageSource | undefined {
|
|
277
326
|
if (!result.valid) return undefined;
|
|
278
327
|
|
|
279
328
|
const snapshot = asImageSource(result.snapshot);
|
|
@@ -285,6 +334,20 @@ export function resolveImageSource(
|
|
|
285
334
|
});
|
|
286
335
|
}
|
|
287
336
|
|
|
337
|
+
/** One resolver belongs to one mounted media component; only its latest tree is kept. */
|
|
338
|
+
export function createImageSourceResolver() {
|
|
339
|
+
let previous: SnapshotResult | undefined;
|
|
340
|
+
let resolved: ResolvedImageSource | undefined;
|
|
341
|
+
return (source: unknown): ResolvedImageSource | undefined => {
|
|
342
|
+
const next = snapshotValue(source, previous);
|
|
343
|
+
if (next !== previous) {
|
|
344
|
+
resolved = resolveSnapshot(next);
|
|
345
|
+
previous = resolved === undefined ? undefined : next;
|
|
346
|
+
}
|
|
347
|
+
return resolved;
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
288
351
|
export function imageSourceKey(
|
|
289
352
|
source: ImageSourcePropType | undefined
|
|
290
353
|
): string {
|