@oxyhq/bloom 0.1.15 → 0.1.17
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/commonjs/avatar/Avatar.js +22 -7
- package/lib/commonjs/avatar/Avatar.js.map +1 -1
- package/lib/commonjs/avatar/index.js +7 -0
- package/lib/commonjs/avatar/index.js.map +1 -1
- package/lib/commonjs/avatar/placeholder-context.js +15 -0
- package/lib/commonjs/avatar/placeholder-context.js.map +1 -0
- package/lib/module/avatar/Avatar.js +22 -7
- package/lib/module/avatar/Avatar.js.map +1 -1
- package/lib/module/avatar/index.js +1 -0
- package/lib/module/avatar/index.js.map +1 -1
- package/lib/module/avatar/placeholder-context.js +10 -0
- package/lib/module/avatar/placeholder-context.js.map +1 -0
- package/lib/typescript/commonjs/avatar/Avatar.d.ts.map +1 -1
- package/lib/typescript/commonjs/avatar/index.d.ts +2 -0
- package/lib/typescript/commonjs/avatar/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/avatar/placeholder-context.d.ts +8 -0
- package/lib/typescript/commonjs/avatar/placeholder-context.d.ts.map +1 -0
- package/lib/typescript/commonjs/avatar/types.d.ts +4 -0
- package/lib/typescript/commonjs/avatar/types.d.ts.map +1 -1
- package/lib/typescript/module/avatar/Avatar.d.ts.map +1 -1
- package/lib/typescript/module/avatar/index.d.ts +2 -0
- package/lib/typescript/module/avatar/index.d.ts.map +1 -1
- package/lib/typescript/module/avatar/placeholder-context.d.ts +8 -0
- package/lib/typescript/module/avatar/placeholder-context.d.ts.map +1 -0
- package/lib/typescript/module/avatar/types.d.ts +4 -0
- package/lib/typescript/module/avatar/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/avatar/Avatar.tsx +19 -6
- package/src/avatar/index.ts +2 -0
- package/src/avatar/placeholder-context.ts +16 -0
- package/src/avatar/types.ts +4 -0
|
@@ -8,6 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
9
|
var _useTheme = require("../theme/use-theme.js");
|
|
10
10
|
var _context = require("../image-resolver/context.js");
|
|
11
|
+
var _placeholderContext = require("./placeholder-context.js");
|
|
11
12
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
13
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
14
|
// Squircle clip path normalized to 0–1 coordinate space (viewBox="0 0 1 1").
|
|
@@ -35,6 +36,7 @@ function SquircleImage({
|
|
|
35
36
|
fallbackSource,
|
|
36
37
|
size,
|
|
37
38
|
fallbackColor,
|
|
39
|
+
placeholderIcon,
|
|
38
40
|
onError
|
|
39
41
|
}) {
|
|
40
42
|
const svg = getSvgModule();
|
|
@@ -42,7 +44,8 @@ function SquircleImage({
|
|
|
42
44
|
// Fallback to circle if react-native-svg is not installed
|
|
43
45
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(CircleFallback, {
|
|
44
46
|
size: size,
|
|
45
|
-
fallbackColor: fallbackColor
|
|
47
|
+
fallbackColor: fallbackColor,
|
|
48
|
+
icon: placeholderIcon
|
|
46
49
|
});
|
|
47
50
|
}
|
|
48
51
|
const {
|
|
@@ -59,7 +62,8 @@ function SquircleImage({
|
|
|
59
62
|
if (!href) {
|
|
60
63
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(CircleFallback, {
|
|
61
64
|
size: size,
|
|
62
|
-
fallbackColor: fallbackColor
|
|
65
|
+
fallbackColor: fallbackColor,
|
|
66
|
+
icon: placeholderIcon
|
|
63
67
|
});
|
|
64
68
|
}
|
|
65
69
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
@@ -92,7 +96,8 @@ function SquircleImage({
|
|
|
92
96
|
}
|
|
93
97
|
function CircleFallback({
|
|
94
98
|
size,
|
|
95
|
-
fallbackColor
|
|
99
|
+
fallbackColor,
|
|
100
|
+
icon
|
|
96
101
|
}) {
|
|
97
102
|
const radius = size / 2;
|
|
98
103
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
@@ -100,8 +105,12 @@ function CircleFallback({
|
|
|
100
105
|
width: size,
|
|
101
106
|
height: size,
|
|
102
107
|
borderRadius: radius,
|
|
103
|
-
backgroundColor: fallbackColor
|
|
104
|
-
|
|
108
|
+
backgroundColor: fallbackColor,
|
|
109
|
+
justifyContent: 'center',
|
|
110
|
+
alignItems: 'center',
|
|
111
|
+
overflow: 'hidden'
|
|
112
|
+
},
|
|
113
|
+
children: icon ?? null
|
|
105
114
|
});
|
|
106
115
|
}
|
|
107
116
|
const AvatarComponent = ({
|
|
@@ -114,13 +123,17 @@ const AvatarComponent = ({
|
|
|
114
123
|
shape = 'circle',
|
|
115
124
|
style,
|
|
116
125
|
imageStyle,
|
|
126
|
+
placeholderColor,
|
|
127
|
+
placeholderIcon,
|
|
117
128
|
onPress,
|
|
118
129
|
testID
|
|
119
130
|
}) => {
|
|
120
131
|
const [errored, setErrored] = (0, _react.useState)(false);
|
|
121
132
|
const theme = (0, _useTheme.useTheme)();
|
|
133
|
+
const placeholderConfig = (0, _placeholderContext.useAvatarPlaceholder)();
|
|
122
134
|
const radius = size / 2;
|
|
123
|
-
const fallbackColor = theme.colors.backgroundTertiary;
|
|
135
|
+
const fallbackColor = placeholderColor || theme.colors.backgroundTertiary;
|
|
136
|
+
const resolvedPlaceholderIcon = placeholderIcon ?? placeholderConfig?.icon?.(size * 0.6);
|
|
124
137
|
|
|
125
138
|
// Reset error state when source changes (e.g., list item recycling
|
|
126
139
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -171,6 +184,7 @@ const AvatarComponent = ({
|
|
|
171
184
|
fallbackSource: fallbackSource,
|
|
172
185
|
size: size,
|
|
173
186
|
fallbackColor: fallbackColor,
|
|
187
|
+
placeholderIcon: resolvedPlaceholderIcon,
|
|
174
188
|
onError: () => setErrored(true)
|
|
175
189
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
176
190
|
style: [styles.imageContainer, {
|
|
@@ -187,7 +201,8 @@ const AvatarComponent = ({
|
|
|
187
201
|
}, imageStyle]
|
|
188
202
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(CircleFallback, {
|
|
189
203
|
size: size,
|
|
190
|
-
fallbackColor: fallbackColor
|
|
204
|
+
fallbackColor: fallbackColor,
|
|
205
|
+
icon: resolvedPlaceholderIcon
|
|
191
206
|
})
|
|
192
207
|
}), verified && verifiedIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
193
208
|
style: [styles.verifiedBadge, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_useTheme","_context","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SQUIRCLE_PATH","clipIdCounter","svgModule","svgModuleResolved","getSvgModule","SquircleImage","uri","fallbackSource","size","fallbackColor","onError","svg","jsx","CircleFallback","Svg","Defs","ClipPath","Path","Image","SvgImage","clipId","useMemo","href","jsxs","Fragment","children","source","style","styles","errorDetector","width","height","viewBox","id","d","preserveAspectRatio","clipPath","radius","View","borderRadius","backgroundColor","AvatarComponent","verified","verifiedIcon","shape","imageStyle","onPress","testID","errored","setErrored","useState","theme","useTheme","colors","backgroundTertiary","prevSourceRef","useRef","prevUriRef","current","imageResolver","useImageResolver","resolvedUri","startsWith","resolvedImageSource","undefined","effectiveUri","imageSource","content","container","imageContainer","resizeMode","StyleSheet","absoluteFillObject","verifiedBadge","TouchableOpacity","create","position","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_useTheme","_context","_placeholderContext","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SQUIRCLE_PATH","clipIdCounter","svgModule","svgModuleResolved","getSvgModule","SquircleImage","uri","fallbackSource","size","fallbackColor","placeholderIcon","onError","svg","jsx","CircleFallback","icon","Svg","Defs","ClipPath","Path","Image","SvgImage","clipId","useMemo","href","jsxs","Fragment","children","source","style","styles","errorDetector","width","height","viewBox","id","d","preserveAspectRatio","clipPath","radius","View","borderRadius","backgroundColor","justifyContent","alignItems","overflow","AvatarComponent","verified","verifiedIcon","shape","imageStyle","placeholderColor","onPress","testID","errored","setErrored","useState","theme","useTheme","placeholderConfig","useAvatarPlaceholder","colors","backgroundTertiary","resolvedPlaceholderIcon","prevSourceRef","useRef","prevUriRef","current","imageResolver","useImageResolver","resolvedUri","startsWith","resolvedImageSource","undefined","effectiveUri","imageSource","content","container","imageContainer","resizeMode","StyleSheet","absoluteFillObject","verifiedBadge","TouchableOpacity","create","position","bottom","right","zIndex","opacity","Avatar","exports","memo","displayName"],"sourceRoot":"../../../src","sources":["avatar/Avatar.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,5 +9,12 @@ Object.defineProperty(exports, "Avatar", {
|
|
|
9
9
|
return _Avatar.Avatar;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
+
Object.defineProperty(exports, "AvatarPlaceholderProvider", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _placeholderContext.AvatarPlaceholderProvider;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
12
18
|
var _Avatar = require("./Avatar.js");
|
|
19
|
+
var _placeholderContext = require("./placeholder-context.js");
|
|
13
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_Avatar","require"],"sourceRoot":"../../../src","sources":["avatar/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_Avatar","require","_placeholderContext"],"sourceRoot":"../../../src","sources":["avatar/index.ts"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAD,OAAA","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.AvatarPlaceholderProvider = void 0;
|
|
7
|
+
exports.useAvatarPlaceholder = useAvatarPlaceholder;
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
const AvatarPlaceholderContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
10
|
+
AvatarPlaceholderContext.displayName = 'BloomAvatarPlaceholderContext';
|
|
11
|
+
const AvatarPlaceholderProvider = exports.AvatarPlaceholderProvider = AvatarPlaceholderContext.Provider;
|
|
12
|
+
function useAvatarPlaceholder() {
|
|
13
|
+
return (0, _react.useContext)(AvatarPlaceholderContext);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=placeholder-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","AvatarPlaceholderContext","createContext","displayName","AvatarPlaceholderProvider","exports","Provider","useAvatarPlaceholder","useContext"],"sourceRoot":"../../../src","sources":["avatar/placeholder-context.ts"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAQA,MAAMC,wBAAwB,gBAAG,IAAAC,oBAAa,EAAiC,IAAI,CAAC;AACpFD,wBAAwB,CAACE,WAAW,GAAG,+BAA+B;AAE/D,MAAMC,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA,GAAGH,wBAAwB,CAACK,QAAQ;AAEnE,SAASC,oBAAoBA,CAAA,EAAmC;EACrE,OAAO,IAAAC,iBAAU,EAACP,wBAAwB,CAAC;AAC7C","ignoreList":[]}
|
|
@@ -4,6 +4,7 @@ import React, { memo, useMemo, useRef, useState } from 'react';
|
|
|
4
4
|
import { View, Image, StyleSheet, TouchableOpacity } from 'react-native';
|
|
5
5
|
import { useTheme } from "../theme/use-theme.js";
|
|
6
6
|
import { useImageResolver } from "../image-resolver/context.js";
|
|
7
|
+
import { useAvatarPlaceholder } from "./placeholder-context.js";
|
|
7
8
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
8
9
|
// Squircle clip path normalized to 0–1 coordinate space (viewBox="0 0 1 1").
|
|
9
10
|
const SQUIRCLE_PATH = 'M0 0.5 L0.00122 0.31674 L0.00489 0.25123 L0.01103 0.20331 L0.01969 0.16478 L0.03097 0.13257 L0.04495 0.10518 L0.0618 0.08177 L0.08177 0.0618 L0.10518 0.04495 L0.13257 0.03097 L0.16478 0.01969 L0.20331 0.01103 L0.25123 0.00489 L0.31674 0.00122 L0.5 0' + ' L0.68895 0.0014 L0.7564 0.00561 L0.80559 0.01267 L0.84499 0.02264 L0.87771 0.03564 L0.9053 0.05181 L0.92862 0.07138 L0.94819 0.0947 L0.96436 0.12228 L0.97736 0.15501 L0.98733 0.19441 L0.99439 0.2436 L0.9986 0.31105 L1 0.5' + ' L0.9986 0.68895 L0.99439 0.7564 L0.98733 0.80559 L0.97736 0.84499 L0.96436 0.87771 L0.94819 0.9053 L0.92862 0.92862 L0.9053 0.94819 L0.87771 0.96436 L0.84499 0.97736 L0.80559 0.98733 L0.7564 0.99439 L0.68895 0.9986 L0.5 1' + ' L0.31105 0.9986 L0.2436 0.99439 L0.19441 0.98733 L0.15501 0.97736 L0.12228 0.96436 L0.0947 0.94819 L0.07138 0.92862 L0.05181 0.9053 L0.03564 0.87771 L0.02264 0.84499 L0.01267 0.80559 L0.00561 0.7564 L0.0014 0.68895 L0 0.5Z';
|
|
@@ -30,6 +31,7 @@ function SquircleImage({
|
|
|
30
31
|
fallbackSource,
|
|
31
32
|
size,
|
|
32
33
|
fallbackColor,
|
|
34
|
+
placeholderIcon,
|
|
33
35
|
onError
|
|
34
36
|
}) {
|
|
35
37
|
const svg = getSvgModule();
|
|
@@ -37,7 +39,8 @@ function SquircleImage({
|
|
|
37
39
|
// Fallback to circle if react-native-svg is not installed
|
|
38
40
|
return /*#__PURE__*/_jsx(CircleFallback, {
|
|
39
41
|
size: size,
|
|
40
|
-
fallbackColor: fallbackColor
|
|
42
|
+
fallbackColor: fallbackColor,
|
|
43
|
+
icon: placeholderIcon
|
|
41
44
|
});
|
|
42
45
|
}
|
|
43
46
|
const {
|
|
@@ -54,7 +57,8 @@ function SquircleImage({
|
|
|
54
57
|
if (!href) {
|
|
55
58
|
return /*#__PURE__*/_jsx(CircleFallback, {
|
|
56
59
|
size: size,
|
|
57
|
-
fallbackColor: fallbackColor
|
|
60
|
+
fallbackColor: fallbackColor,
|
|
61
|
+
icon: placeholderIcon
|
|
58
62
|
});
|
|
59
63
|
}
|
|
60
64
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
@@ -87,7 +91,8 @@ function SquircleImage({
|
|
|
87
91
|
}
|
|
88
92
|
function CircleFallback({
|
|
89
93
|
size,
|
|
90
|
-
fallbackColor
|
|
94
|
+
fallbackColor,
|
|
95
|
+
icon
|
|
91
96
|
}) {
|
|
92
97
|
const radius = size / 2;
|
|
93
98
|
return /*#__PURE__*/_jsx(View, {
|
|
@@ -95,8 +100,12 @@ function CircleFallback({
|
|
|
95
100
|
width: size,
|
|
96
101
|
height: size,
|
|
97
102
|
borderRadius: radius,
|
|
98
|
-
backgroundColor: fallbackColor
|
|
99
|
-
|
|
103
|
+
backgroundColor: fallbackColor,
|
|
104
|
+
justifyContent: 'center',
|
|
105
|
+
alignItems: 'center',
|
|
106
|
+
overflow: 'hidden'
|
|
107
|
+
},
|
|
108
|
+
children: icon ?? null
|
|
100
109
|
});
|
|
101
110
|
}
|
|
102
111
|
const AvatarComponent = ({
|
|
@@ -109,13 +118,17 @@ const AvatarComponent = ({
|
|
|
109
118
|
shape = 'circle',
|
|
110
119
|
style,
|
|
111
120
|
imageStyle,
|
|
121
|
+
placeholderColor,
|
|
122
|
+
placeholderIcon,
|
|
112
123
|
onPress,
|
|
113
124
|
testID
|
|
114
125
|
}) => {
|
|
115
126
|
const [errored, setErrored] = useState(false);
|
|
116
127
|
const theme = useTheme();
|
|
128
|
+
const placeholderConfig = useAvatarPlaceholder();
|
|
117
129
|
const radius = size / 2;
|
|
118
|
-
const fallbackColor = theme.colors.backgroundTertiary;
|
|
130
|
+
const fallbackColor = placeholderColor || theme.colors.backgroundTertiary;
|
|
131
|
+
const resolvedPlaceholderIcon = placeholderIcon ?? placeholderConfig?.icon?.(size * 0.6);
|
|
119
132
|
|
|
120
133
|
// Reset error state when source changes (e.g., list item recycling
|
|
121
134
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -166,6 +179,7 @@ const AvatarComponent = ({
|
|
|
166
179
|
fallbackSource: fallbackSource,
|
|
167
180
|
size: size,
|
|
168
181
|
fallbackColor: fallbackColor,
|
|
182
|
+
placeholderIcon: resolvedPlaceholderIcon,
|
|
169
183
|
onError: () => setErrored(true)
|
|
170
184
|
}) : /*#__PURE__*/_jsx(View, {
|
|
171
185
|
style: [styles.imageContainer, {
|
|
@@ -182,7 +196,8 @@ const AvatarComponent = ({
|
|
|
182
196
|
}, imageStyle]
|
|
183
197
|
}) : /*#__PURE__*/_jsx(CircleFallback, {
|
|
184
198
|
size: size,
|
|
185
|
-
fallbackColor: fallbackColor
|
|
199
|
+
fallbackColor: fallbackColor,
|
|
200
|
+
icon: resolvedPlaceholderIcon
|
|
186
201
|
})
|
|
187
202
|
}), verified && verifiedIcon && /*#__PURE__*/_jsx(View, {
|
|
188
203
|
style: [styles.verifiedBadge, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","memo","useMemo","useRef","useState","View","Image","StyleSheet","TouchableOpacity","useTheme","useImageResolver","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","SQUIRCLE_PATH","clipIdCounter","svgModule","svgModuleResolved","getSvgModule","require","SquircleImage","uri","fallbackSource","size","fallbackColor","onError","svg","CircleFallback","default","Svg","Defs","ClipPath","Path","SvgImage","clipId","href","children","source","style","styles","errorDetector","width","height","viewBox","id","d","preserveAspectRatio","clipPath","radius","borderRadius","backgroundColor","AvatarComponent","verified","verifiedIcon","shape","imageStyle","onPress","testID","errored","setErrored","theme","colors","backgroundTertiary","prevSourceRef","prevUriRef","current","imageResolver","resolvedUri","startsWith","resolvedImageSource","undefined","effectiveUri","imageSource","content","container","imageContainer","resizeMode","absoluteFillObject","verifiedBadge","create","position","
|
|
1
|
+
{"version":3,"names":["React","memo","useMemo","useRef","useState","View","Image","StyleSheet","TouchableOpacity","useTheme","useImageResolver","useAvatarPlaceholder","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","SQUIRCLE_PATH","clipIdCounter","svgModule","svgModuleResolved","getSvgModule","require","SquircleImage","uri","fallbackSource","size","fallbackColor","placeholderIcon","onError","svg","CircleFallback","icon","default","Svg","Defs","ClipPath","Path","SvgImage","clipId","href","children","source","style","styles","errorDetector","width","height","viewBox","id","d","preserveAspectRatio","clipPath","radius","borderRadius","backgroundColor","justifyContent","alignItems","overflow","AvatarComponent","verified","verifiedIcon","shape","imageStyle","placeholderColor","onPress","testID","errored","setErrored","theme","placeholderConfig","colors","backgroundTertiary","resolvedPlaceholderIcon","prevSourceRef","prevUriRef","current","imageResolver","resolvedUri","startsWith","resolvedImageSource","undefined","effectiveUri","imageSource","content","container","imageContainer","resizeMode","absoluteFillObject","verifiedBadge","create","position","bottom","right","zIndex","opacity","Avatar","displayName"],"sourceRoot":"../../../src","sources":["avatar/Avatar.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Avatar"],"sourceRoot":"../../../src","sources":["avatar/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,aAAU","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Avatar","AvatarPlaceholderProvider"],"sourceRoot":"../../../src","sources":["avatar/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,aAAU;AACjC,SAASC,yBAAyB,QAAQ,0BAAuB","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { createContext, useContext } from 'react';
|
|
4
|
+
const AvatarPlaceholderContext = /*#__PURE__*/createContext(null);
|
|
5
|
+
AvatarPlaceholderContext.displayName = 'BloomAvatarPlaceholderContext';
|
|
6
|
+
export const AvatarPlaceholderProvider = AvatarPlaceholderContext.Provider;
|
|
7
|
+
export function useAvatarPlaceholder() {
|
|
8
|
+
return useContext(AvatarPlaceholderContext);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=placeholder-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","useContext","AvatarPlaceholderContext","displayName","AvatarPlaceholderProvider","Provider","useAvatarPlaceholder"],"sourceRoot":"../../../src","sources":["avatar/placeholder-context.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAQjD,MAAMC,wBAAwB,gBAAGF,aAAa,CAAiC,IAAI,CAAC;AACpFE,wBAAwB,CAACC,WAAW,GAAG,+BAA+B;AAEtE,OAAO,MAAMC,yBAAyB,GAAGF,wBAAwB,CAACG,QAAQ;AAE1E,OAAO,SAASC,oBAAoBA,CAAA,EAAmC;EACrE,OAAOL,UAAU,CAACC,wBAAwB,CAAC;AAC7C","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../src/avatar/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../src/avatar/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAM/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAqP3C,eAAO,MAAM,MAAM,yCAAwB,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { Avatar } from './Avatar';
|
|
2
|
+
export { AvatarPlaceholderProvider } from './placeholder-context';
|
|
3
|
+
export type { AvatarPlaceholderConfig } from './placeholder-context';
|
|
2
4
|
export type { AvatarProps, AvatarShape } from './types';
|
|
3
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface AvatarPlaceholderConfig {
|
|
3
|
+
/** Default icon to render inside the placeholder circle */
|
|
4
|
+
icon?: (size: number) => ReactNode;
|
|
5
|
+
}
|
|
6
|
+
export declare const AvatarPlaceholderProvider: import("react").Provider<AvatarPlaceholderConfig | null>;
|
|
7
|
+
export declare function useAvatarPlaceholder(): AvatarPlaceholderConfig | null;
|
|
8
|
+
//# sourceMappingURL=placeholder-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder-context.d.ts","sourceRoot":"","sources":["../../../../src/avatar/placeholder-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,uBAAuB;IACtC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;CACpC;AAKD,eAAO,MAAM,yBAAyB,0DAAoC,CAAC;AAE3E,wBAAgB,oBAAoB,IAAI,uBAAuB,GAAG,IAAI,CAErE"}
|
|
@@ -24,6 +24,10 @@ export interface AvatarProps {
|
|
|
24
24
|
style?: StyleProp<ViewStyle>;
|
|
25
25
|
/** Image style (circle shape only) */
|
|
26
26
|
imageStyle?: StyleProp<ImageStyle>;
|
|
27
|
+
/** Custom background color for the placeholder circle (overrides theme default) */
|
|
28
|
+
placeholderColor?: string;
|
|
29
|
+
/** Custom icon rendered inside the placeholder circle when no image is available */
|
|
30
|
+
placeholderIcon?: ReactNode;
|
|
27
31
|
/** Press handler — wraps avatar in TouchableOpacity when provided */
|
|
28
32
|
onPress?: () => void;
|
|
29
33
|
testID?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/avatar/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1F,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAC;IAC7C,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,wFAAwF;IACxF,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,sBAAsB;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,sCAAsC;IACtC,UAAU,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACnC,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/avatar/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1F,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAC;IAC7C,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,wFAAwF;IACxF,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,sBAAsB;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,sCAAsC;IACtC,UAAU,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACnC,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../src/avatar/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../src/avatar/Avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAM/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAqP3C,eAAO,MAAM,MAAM,yCAAwB,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { Avatar } from './Avatar';
|
|
2
|
+
export { AvatarPlaceholderProvider } from './placeholder-context';
|
|
3
|
+
export type { AvatarPlaceholderConfig } from './placeholder-context';
|
|
2
4
|
export type { AvatarProps, AvatarShape } from './types';
|
|
3
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface AvatarPlaceholderConfig {
|
|
3
|
+
/** Default icon to render inside the placeholder circle */
|
|
4
|
+
icon?: (size: number) => ReactNode;
|
|
5
|
+
}
|
|
6
|
+
export declare const AvatarPlaceholderProvider: import("react").Provider<AvatarPlaceholderConfig | null>;
|
|
7
|
+
export declare function useAvatarPlaceholder(): AvatarPlaceholderConfig | null;
|
|
8
|
+
//# sourceMappingURL=placeholder-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder-context.d.ts","sourceRoot":"","sources":["../../../../src/avatar/placeholder-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,uBAAuB;IACtC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;CACpC;AAKD,eAAO,MAAM,yBAAyB,0DAAoC,CAAC;AAE3E,wBAAgB,oBAAoB,IAAI,uBAAuB,GAAG,IAAI,CAErE"}
|
|
@@ -24,6 +24,10 @@ export interface AvatarProps {
|
|
|
24
24
|
style?: StyleProp<ViewStyle>;
|
|
25
25
|
/** Image style (circle shape only) */
|
|
26
26
|
imageStyle?: StyleProp<ImageStyle>;
|
|
27
|
+
/** Custom background color for the placeholder circle (overrides theme default) */
|
|
28
|
+
placeholderColor?: string;
|
|
29
|
+
/** Custom icon rendered inside the placeholder circle when no image is available */
|
|
30
|
+
placeholderIcon?: ReactNode;
|
|
27
31
|
/** Press handler — wraps avatar in TouchableOpacity when provided */
|
|
28
32
|
onPress?: () => void;
|
|
29
33
|
testID?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/avatar/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1F,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAC;IAC7C,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,wFAAwF;IACxF,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,sBAAsB;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,sCAAsC;IACtC,UAAU,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACnC,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/avatar/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1F,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAC;IAC7C,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,wFAAwF;IACxF,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,sBAAsB;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,sCAAsC;IACtC,UAAU,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACnC,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
package/package.json
CHANGED
package/src/avatar/Avatar.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import { View, Image, StyleSheet, TouchableOpacity } from 'react-native';
|
|
|
3
3
|
|
|
4
4
|
import { useTheme } from '../theme/use-theme';
|
|
5
5
|
import { useImageResolver } from '../image-resolver/context';
|
|
6
|
+
import { useAvatarPlaceholder } from './placeholder-context';
|
|
6
7
|
import type { AvatarProps } from './types';
|
|
7
8
|
|
|
8
9
|
// Squircle clip path normalized to 0–1 coordinate space (viewBox="0 0 1 1").
|
|
@@ -37,18 +38,20 @@ function SquircleImage({
|
|
|
37
38
|
fallbackSource,
|
|
38
39
|
size,
|
|
39
40
|
fallbackColor,
|
|
41
|
+
placeholderIcon,
|
|
40
42
|
onError,
|
|
41
43
|
}: {
|
|
42
44
|
uri?: string;
|
|
43
45
|
fallbackSource?: AvatarProps['fallbackSource'];
|
|
44
46
|
size: number;
|
|
45
47
|
fallbackColor: string;
|
|
48
|
+
placeholderIcon?: React.ReactNode;
|
|
46
49
|
onError: () => void;
|
|
47
50
|
}) {
|
|
48
51
|
const svg = getSvgModule();
|
|
49
52
|
if (!svg) {
|
|
50
53
|
// Fallback to circle if react-native-svg is not installed
|
|
51
|
-
return <CircleFallback size={size} fallbackColor={fallbackColor} />;
|
|
54
|
+
return <CircleFallback size={size} fallbackColor={fallbackColor} icon={placeholderIcon} />;
|
|
52
55
|
}
|
|
53
56
|
|
|
54
57
|
const { default: Svg, Defs, ClipPath, Path, Image: SvgImage } = svg;
|
|
@@ -56,7 +59,7 @@ function SquircleImage({
|
|
|
56
59
|
|
|
57
60
|
const href = uri ? { uri } : fallbackSource;
|
|
58
61
|
if (!href) {
|
|
59
|
-
return <CircleFallback size={size} fallbackColor={fallbackColor} />;
|
|
62
|
+
return <CircleFallback size={size} fallbackColor={fallbackColor} icon={placeholderIcon} />;
|
|
60
63
|
}
|
|
61
64
|
|
|
62
65
|
return (
|
|
@@ -87,7 +90,7 @@ function SquircleImage({
|
|
|
87
90
|
);
|
|
88
91
|
}
|
|
89
92
|
|
|
90
|
-
function CircleFallback({ size, fallbackColor }: { size: number; fallbackColor: string }) {
|
|
93
|
+
function CircleFallback({ size, fallbackColor, icon }: { size: number; fallbackColor: string; icon?: React.ReactNode }) {
|
|
91
94
|
const radius = size / 2;
|
|
92
95
|
return (
|
|
93
96
|
<View
|
|
@@ -96,8 +99,13 @@ function CircleFallback({ size, fallbackColor }: { size: number; fallbackColor:
|
|
|
96
99
|
height: size,
|
|
97
100
|
borderRadius: radius,
|
|
98
101
|
backgroundColor: fallbackColor,
|
|
102
|
+
justifyContent: 'center',
|
|
103
|
+
alignItems: 'center',
|
|
104
|
+
overflow: 'hidden',
|
|
99
105
|
}}
|
|
100
|
-
|
|
106
|
+
>
|
|
107
|
+
{icon ?? null}
|
|
108
|
+
</View>
|
|
101
109
|
);
|
|
102
110
|
}
|
|
103
111
|
|
|
@@ -111,13 +119,17 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
111
119
|
shape = 'circle',
|
|
112
120
|
style,
|
|
113
121
|
imageStyle,
|
|
122
|
+
placeholderColor,
|
|
123
|
+
placeholderIcon,
|
|
114
124
|
onPress,
|
|
115
125
|
testID,
|
|
116
126
|
}) => {
|
|
117
127
|
const [errored, setErrored] = useState(false);
|
|
118
128
|
const theme = useTheme();
|
|
129
|
+
const placeholderConfig = useAvatarPlaceholder();
|
|
119
130
|
const radius = size / 2;
|
|
120
|
-
const fallbackColor = theme.colors.backgroundTertiary;
|
|
131
|
+
const fallbackColor = placeholderColor || theme.colors.backgroundTertiary;
|
|
132
|
+
const resolvedPlaceholderIcon = placeholderIcon ?? placeholderConfig?.icon?.(size * 0.6);
|
|
121
133
|
|
|
122
134
|
// Reset error state when source changes (e.g., list item recycling
|
|
123
135
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -168,6 +180,7 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
168
180
|
fallbackSource={fallbackSource}
|
|
169
181
|
size={size}
|
|
170
182
|
fallbackColor={fallbackColor}
|
|
183
|
+
placeholderIcon={resolvedPlaceholderIcon}
|
|
171
184
|
onError={() => setErrored(true)}
|
|
172
185
|
/>
|
|
173
186
|
) : (
|
|
@@ -180,7 +193,7 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
180
193
|
style={[StyleSheet.absoluteFillObject, { borderRadius: radius }, imageStyle]}
|
|
181
194
|
/>
|
|
182
195
|
) : (
|
|
183
|
-
<CircleFallback size={size} fallbackColor={fallbackColor} />
|
|
196
|
+
<CircleFallback size={size} fallbackColor={fallbackColor} icon={resolvedPlaceholderIcon} />
|
|
184
197
|
)}
|
|
185
198
|
</View>
|
|
186
199
|
)}
|
package/src/avatar/index.ts
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
export interface AvatarPlaceholderConfig {
|
|
5
|
+
/** Default icon to render inside the placeholder circle */
|
|
6
|
+
icon?: (size: number) => ReactNode;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const AvatarPlaceholderContext = createContext<AvatarPlaceholderConfig | null>(null);
|
|
10
|
+
AvatarPlaceholderContext.displayName = 'BloomAvatarPlaceholderContext';
|
|
11
|
+
|
|
12
|
+
export const AvatarPlaceholderProvider = AvatarPlaceholderContext.Provider;
|
|
13
|
+
|
|
14
|
+
export function useAvatarPlaceholder(): AvatarPlaceholderConfig | null {
|
|
15
|
+
return useContext(AvatarPlaceholderContext);
|
|
16
|
+
}
|
package/src/avatar/types.ts
CHANGED
|
@@ -26,6 +26,10 @@ export interface AvatarProps {
|
|
|
26
26
|
style?: StyleProp<ViewStyle>;
|
|
27
27
|
/** Image style (circle shape only) */
|
|
28
28
|
imageStyle?: StyleProp<ImageStyle>;
|
|
29
|
+
/** Custom background color for the placeholder circle (overrides theme default) */
|
|
30
|
+
placeholderColor?: string;
|
|
31
|
+
/** Custom icon rendered inside the placeholder circle when no image is available */
|
|
32
|
+
placeholderIcon?: ReactNode;
|
|
29
33
|
/** Press handler — wraps avatar in TouchableOpacity when provided */
|
|
30
34
|
onPress?: () => void;
|
|
31
35
|
testID?: string;
|