@oxyhq/bloom 0.1.16 → 0.1.18
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 +9 -3
- package/lib/commonjs/avatar/Avatar.js.map +1 -1
- package/lib/commonjs/avatar/default-avatar.jpg +0 -0
- package/lib/commonjs/avatar/index.js +10 -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 +9 -3
- package/lib/module/avatar/Avatar.js.map +1 -1
- package/lib/module/avatar/default-avatar.jpg +0 -0
- package/lib/module/avatar/index.js +3 -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 +4 -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/module/avatar/Avatar.d.ts.map +1 -1
- package/lib/typescript/module/avatar/index.d.ts +4 -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/package.json +1 -1
- package/src/avatar/Avatar.tsx +9 -3
- package/src/avatar/default-avatar.jpg +0 -0
- package/src/avatar/index.ts +5 -0
- package/src/avatar/placeholder-context.ts +16 -0
|
@@ -8,8 +8,12 @@ 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); }
|
|
14
|
+
// Built-in default avatar image — used when no source, fallbackSource, or placeholderIcon is provided
|
|
15
|
+
const DEFAULT_AVATAR_IMAGE = require('./default-avatar.jpg');
|
|
16
|
+
|
|
13
17
|
// Squircle clip path normalized to 0–1 coordinate space (viewBox="0 0 1 1").
|
|
14
18
|
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';
|
|
15
19
|
let clipIdCounter = 0;
|
|
@@ -129,8 +133,10 @@ const AvatarComponent = ({
|
|
|
129
133
|
}) => {
|
|
130
134
|
const [errored, setErrored] = (0, _react.useState)(false);
|
|
131
135
|
const theme = (0, _useTheme.useTheme)();
|
|
136
|
+
const placeholderConfig = (0, _placeholderContext.useAvatarPlaceholder)();
|
|
132
137
|
const radius = size / 2;
|
|
133
138
|
const fallbackColor = placeholderColor || theme.colors.backgroundTertiary;
|
|
139
|
+
const resolvedPlaceholderIcon = placeholderIcon ?? placeholderConfig?.icon?.(size * 0.6);
|
|
134
140
|
|
|
135
141
|
// Reset error state when source changes (e.g., list item recycling
|
|
136
142
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -168,7 +174,7 @@ const AvatarComponent = ({
|
|
|
168
174
|
uri: effectiveUri
|
|
169
175
|
};
|
|
170
176
|
if (resolvedImageSource) return resolvedImageSource;
|
|
171
|
-
return fallbackSource;
|
|
177
|
+
return fallbackSource || DEFAULT_AVATAR_IMAGE;
|
|
172
178
|
}, [effectiveUri, resolvedImageSource, fallbackSource]);
|
|
173
179
|
const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
174
180
|
style: [styles.container, {
|
|
@@ -181,7 +187,7 @@ const AvatarComponent = ({
|
|
|
181
187
|
fallbackSource: fallbackSource,
|
|
182
188
|
size: size,
|
|
183
189
|
fallbackColor: fallbackColor,
|
|
184
|
-
placeholderIcon:
|
|
190
|
+
placeholderIcon: resolvedPlaceholderIcon,
|
|
185
191
|
onError: () => setErrored(true)
|
|
186
192
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
187
193
|
style: [styles.imageContainer, {
|
|
@@ -199,7 +205,7 @@ const AvatarComponent = ({
|
|
|
199
205
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(CircleFallback, {
|
|
200
206
|
size: size,
|
|
201
207
|
fallbackColor: fallbackColor,
|
|
202
|
-
icon:
|
|
208
|
+
icon: resolvedPlaceholderIcon
|
|
203
209
|
})
|
|
204
210
|
}), verified && verifiedIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
205
211
|
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","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","colors","backgroundTertiary","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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;
|
|
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","DEFAULT_AVATAR_IMAGE","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":[]}
|
|
Binary file
|
|
@@ -9,5 +9,15 @@ 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
|
+
});
|
|
18
|
+
exports.defaultAvatarSource = void 0;
|
|
12
19
|
var _Avatar = require("./Avatar.js");
|
|
20
|
+
var _placeholderContext = require("./placeholder-context.js");
|
|
21
|
+
/** Default avatar placeholder image — use as `fallbackSource` on Avatar or in AvatarPlaceholderProvider */
|
|
22
|
+
const defaultAvatarSource = exports.defaultAvatarSource = require('./default-avatar.jpg');
|
|
13
23
|
//# 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","defaultAvatarSource","exports"],"sourceRoot":"../../../src","sources":["avatar/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAD,OAAA;AAIA;AACO,MAAME,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,GAAGF,OAAO,CAAC,sBAAsB,CAAC","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,7 +4,11 @@ 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";
|
|
9
|
+
// Built-in default avatar image — used when no source, fallbackSource, or placeholderIcon is provided
|
|
10
|
+
const DEFAULT_AVATAR_IMAGE = require('./default-avatar.jpg');
|
|
11
|
+
|
|
8
12
|
// Squircle clip path normalized to 0–1 coordinate space (viewBox="0 0 1 1").
|
|
9
13
|
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';
|
|
10
14
|
let clipIdCounter = 0;
|
|
@@ -124,8 +128,10 @@ const AvatarComponent = ({
|
|
|
124
128
|
}) => {
|
|
125
129
|
const [errored, setErrored] = useState(false);
|
|
126
130
|
const theme = useTheme();
|
|
131
|
+
const placeholderConfig = useAvatarPlaceholder();
|
|
127
132
|
const radius = size / 2;
|
|
128
133
|
const fallbackColor = placeholderColor || theme.colors.backgroundTertiary;
|
|
134
|
+
const resolvedPlaceholderIcon = placeholderIcon ?? placeholderConfig?.icon?.(size * 0.6);
|
|
129
135
|
|
|
130
136
|
// Reset error state when source changes (e.g., list item recycling
|
|
131
137
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -163,7 +169,7 @@ const AvatarComponent = ({
|
|
|
163
169
|
uri: effectiveUri
|
|
164
170
|
};
|
|
165
171
|
if (resolvedImageSource) return resolvedImageSource;
|
|
166
|
-
return fallbackSource;
|
|
172
|
+
return fallbackSource || DEFAULT_AVATAR_IMAGE;
|
|
167
173
|
}, [effectiveUri, resolvedImageSource, fallbackSource]);
|
|
168
174
|
const content = /*#__PURE__*/_jsxs(View, {
|
|
169
175
|
style: [styles.container, {
|
|
@@ -176,7 +182,7 @@ const AvatarComponent = ({
|
|
|
176
182
|
fallbackSource: fallbackSource,
|
|
177
183
|
size: size,
|
|
178
184
|
fallbackColor: fallbackColor,
|
|
179
|
-
placeholderIcon:
|
|
185
|
+
placeholderIcon: resolvedPlaceholderIcon,
|
|
180
186
|
onError: () => setErrored(true)
|
|
181
187
|
}) : /*#__PURE__*/_jsx(View, {
|
|
182
188
|
style: [styles.imageContainer, {
|
|
@@ -194,7 +200,7 @@ const AvatarComponent = ({
|
|
|
194
200
|
}) : /*#__PURE__*/_jsx(CircleFallback, {
|
|
195
201
|
size: size,
|
|
196
202
|
fallbackColor: fallbackColor,
|
|
197
|
-
icon:
|
|
203
|
+
icon: resolvedPlaceholderIcon
|
|
198
204
|
})
|
|
199
205
|
}), verified && verifiedIcon && /*#__PURE__*/_jsx(View, {
|
|
200
206
|
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","
|
|
1
|
+
{"version":3,"names":["React","memo","useMemo","useRef","useState","View","Image","StyleSheet","TouchableOpacity","useTheme","useImageResolver","useAvatarPlaceholder","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","DEFAULT_AVATAR_IMAGE","require","SQUIRCLE_PATH","clipIdCounter","svgModule","svgModuleResolved","getSvgModule","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":[]}
|
|
Binary file
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
export { Avatar } from "./Avatar.js";
|
|
4
|
+
export { AvatarPlaceholderProvider } from "./placeholder-context.js";
|
|
5
|
+
/** Default avatar placeholder image — use as `fallbackSource` on Avatar or in AvatarPlaceholderProvider */
|
|
6
|
+
export const defaultAvatarSource = require('./default-avatar.jpg');
|
|
4
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -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","defaultAvatarSource","require"],"sourceRoot":"../../../src","sources":["avatar/index.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,aAAU;AACjC,SAASC,yBAAyB,QAAQ,0BAAuB;AAIjE;AACA,OAAO,MAAMC,mBAAmB,GAAGC,OAAO,CAAC,sBAAsB,CAAC","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;AAwP3C,eAAO,MAAM,MAAM,yCAAwB,CAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
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';
|
|
5
|
+
/** Default avatar placeholder image — use as `fallbackSource` on Avatar or in AvatarPlaceholderProvider */
|
|
6
|
+
export declare const defaultAvatarSource: any;
|
|
3
7
|
//# 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;AAExD,2GAA2G;AAC3G,eAAO,MAAM,mBAAmB,KAAkC,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"}
|
|
@@ -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;AAwP3C,eAAO,MAAM,MAAM,yCAAwB,CAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
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';
|
|
5
|
+
/** Default avatar placeholder image — use as `fallbackSource` on Avatar or in AvatarPlaceholderProvider */
|
|
6
|
+
export declare const defaultAvatarSource: any;
|
|
3
7
|
//# 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;AAExD,2GAA2G;AAC3G,eAAO,MAAM,mBAAmB,KAAkC,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"}
|
package/package.json
CHANGED
package/src/avatar/Avatar.tsx
CHANGED
|
@@ -3,8 +3,12 @@ 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
|
|
|
9
|
+
// Built-in default avatar image — used when no source, fallbackSource, or placeholderIcon is provided
|
|
10
|
+
const DEFAULT_AVATAR_IMAGE = require('./default-avatar.jpg');
|
|
11
|
+
|
|
8
12
|
// Squircle clip path normalized to 0–1 coordinate space (viewBox="0 0 1 1").
|
|
9
13
|
const SQUIRCLE_PATH =
|
|
10
14
|
'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' +
|
|
@@ -125,8 +129,10 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
125
129
|
}) => {
|
|
126
130
|
const [errored, setErrored] = useState(false);
|
|
127
131
|
const theme = useTheme();
|
|
132
|
+
const placeholderConfig = useAvatarPlaceholder();
|
|
128
133
|
const radius = size / 2;
|
|
129
134
|
const fallbackColor = placeholderColor || theme.colors.backgroundTertiary;
|
|
135
|
+
const resolvedPlaceholderIcon = placeholderIcon ?? placeholderConfig?.icon?.(size * 0.6);
|
|
130
136
|
|
|
131
137
|
// Reset error state when source changes (e.g., list item recycling
|
|
132
138
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -166,7 +172,7 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
166
172
|
const imageSource = useMemo(() => {
|
|
167
173
|
if (effectiveUri) return { uri: effectiveUri };
|
|
168
174
|
if (resolvedImageSource) return resolvedImageSource;
|
|
169
|
-
return fallbackSource;
|
|
175
|
+
return fallbackSource || DEFAULT_AVATAR_IMAGE;
|
|
170
176
|
}, [effectiveUri, resolvedImageSource, fallbackSource]);
|
|
171
177
|
|
|
172
178
|
const content = (
|
|
@@ -177,7 +183,7 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
177
183
|
fallbackSource={fallbackSource}
|
|
178
184
|
size={size}
|
|
179
185
|
fallbackColor={fallbackColor}
|
|
180
|
-
placeholderIcon={
|
|
186
|
+
placeholderIcon={resolvedPlaceholderIcon}
|
|
181
187
|
onError={() => setErrored(true)}
|
|
182
188
|
/>
|
|
183
189
|
) : (
|
|
@@ -190,7 +196,7 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
190
196
|
style={[StyleSheet.absoluteFillObject, { borderRadius: radius }, imageStyle]}
|
|
191
197
|
/>
|
|
192
198
|
) : (
|
|
193
|
-
<CircleFallback size={size} fallbackColor={fallbackColor} icon={
|
|
199
|
+
<CircleFallback size={size} fallbackColor={fallbackColor} icon={resolvedPlaceholderIcon} />
|
|
194
200
|
)}
|
|
195
201
|
</View>
|
|
196
202
|
)}
|
|
Binary file
|
package/src/avatar/index.ts
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
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';
|
|
5
|
+
|
|
6
|
+
/** Default avatar placeholder image — use as `fallbackSource` on Avatar or in AvatarPlaceholderProvider */
|
|
7
|
+
export const defaultAvatarSource = require('./default-avatar.jpg');
|
|
@@ -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
|
+
}
|