@oxyhq/bloom 0.1.34 → 0.1.36
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 +54 -8
- package/lib/commonjs/avatar/Avatar.js.map +1 -1
- package/lib/commonjs/theme/set-color-scheme-safe.js +9 -0
- package/lib/commonjs/theme/set-color-scheme-safe.js.map +1 -1
- package/lib/module/avatar/Avatar.js +55 -9
- package/lib/module/avatar/Avatar.js.map +1 -1
- package/lib/module/theme/set-color-scheme-safe.js +10 -1
- package/lib/module/theme/set-color-scheme-safe.js.map +1 -1
- package/lib/typescript/commonjs/avatar/Avatar.d.ts.map +1 -1
- package/lib/typescript/commonjs/avatar/types.d.ts +7 -0
- package/lib/typescript/commonjs/avatar/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/set-color-scheme-safe.d.ts +6 -0
- package/lib/typescript/commonjs/theme/set-color-scheme-safe.d.ts.map +1 -1
- package/lib/typescript/module/avatar/Avatar.d.ts.map +1 -1
- package/lib/typescript/module/avatar/types.d.ts +7 -0
- package/lib/typescript/module/avatar/types.d.ts.map +1 -1
- package/lib/typescript/module/theme/set-color-scheme-safe.d.ts +6 -0
- package/lib/typescript/module/theme/set-color-scheme-safe.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/avatar/Avatar.tsx +78 -9
- package/src/avatar/types.ts +7 -0
- package/src/theme/set-color-scheme-safe.ts +10 -1
|
@@ -14,6 +14,25 @@ var _defaultAvatar = _interopRequireDefault(require("./default-avatar.jpg"));
|
|
|
14
14
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
16
|
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); }
|
|
17
|
+
// Google Contacts-inspired palette used to pick a deterministic background
|
|
18
|
+
// color for name-based placeholder avatars.
|
|
19
|
+
const NAME_AVATAR_COLORS = ['#D93025', '#E8710A', '#F9AB00', '#1E8E3E', '#12B5CB', '#1A73E8', '#7627BB', '#C5221F', '#0B8043', '#A142F4'];
|
|
20
|
+
function getInitial(name) {
|
|
21
|
+
const trimmed = name.trim();
|
|
22
|
+
if (!trimmed) return '?';
|
|
23
|
+
const firstCodePoint = [...trimmed][0] ?? '?';
|
|
24
|
+
return firstCodePoint.toUpperCase();
|
|
25
|
+
}
|
|
26
|
+
function getNameColor(name) {
|
|
27
|
+
let hash = 0;
|
|
28
|
+
for (let i = 0; i < name.length; i++) {
|
|
29
|
+
hash = hash * 31 + name.charCodeAt(i) | 0;
|
|
30
|
+
}
|
|
31
|
+
const index = Math.abs(hash) % NAME_AVATAR_COLORS.length;
|
|
32
|
+
// Palette has a fixed, non-empty length, so this lookup always succeeds.
|
|
33
|
+
return NAME_AVATAR_COLORS[index] ?? NAME_AVATAR_COLORS[0];
|
|
34
|
+
}
|
|
35
|
+
|
|
17
36
|
// Built-in default avatar image — used when no source, fallbackSource, or placeholderIcon is provided
|
|
18
37
|
// ESM static import works in both Metro (RN 0.72+) and web bundlers (Vite, webpack).
|
|
19
38
|
|
|
@@ -31,6 +50,7 @@ function SquircleImage({
|
|
|
31
50
|
size,
|
|
32
51
|
fallbackColor,
|
|
33
52
|
placeholderIcon,
|
|
53
|
+
name,
|
|
34
54
|
onError
|
|
35
55
|
}) {
|
|
36
56
|
const svg = getSvgModule();
|
|
@@ -39,7 +59,8 @@ function SquircleImage({
|
|
|
39
59
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(CircleFallback, {
|
|
40
60
|
size: size,
|
|
41
61
|
fallbackColor: fallbackColor,
|
|
42
|
-
icon: placeholderIcon
|
|
62
|
+
icon: placeholderIcon,
|
|
63
|
+
name: name
|
|
43
64
|
});
|
|
44
65
|
}
|
|
45
66
|
const {
|
|
@@ -57,7 +78,8 @@ function SquircleImage({
|
|
|
57
78
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(CircleFallback, {
|
|
58
79
|
size: size,
|
|
59
80
|
fallbackColor: fallbackColor,
|
|
60
|
-
icon: placeholderIcon
|
|
81
|
+
icon: placeholderIcon,
|
|
82
|
+
name: name
|
|
61
83
|
});
|
|
62
84
|
}
|
|
63
85
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
@@ -91,9 +113,21 @@ function SquircleImage({
|
|
|
91
113
|
function CircleFallback({
|
|
92
114
|
size,
|
|
93
115
|
fallbackColor,
|
|
94
|
-
icon
|
|
116
|
+
icon,
|
|
117
|
+
name
|
|
95
118
|
}) {
|
|
96
119
|
const radius = size / 2;
|
|
120
|
+
// If a name is provided (and no custom icon was supplied), render a
|
|
121
|
+
// centered initial in white instead of the default avatar image.
|
|
122
|
+
const hasName = typeof name === 'string' && name.trim().length > 0;
|
|
123
|
+
const initialStyle = {
|
|
124
|
+
color: '#FFFFFF',
|
|
125
|
+
fontSize: Math.round(size * 0.42),
|
|
126
|
+
fontWeight: '600',
|
|
127
|
+
lineHeight: Math.round(size * 0.48),
|
|
128
|
+
textAlign: 'center',
|
|
129
|
+
includeFontPadding: false
|
|
130
|
+
};
|
|
97
131
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
98
132
|
style: {
|
|
99
133
|
width: size,
|
|
@@ -104,7 +138,12 @@ function CircleFallback({
|
|
|
104
138
|
alignItems: 'center',
|
|
105
139
|
overflow: 'hidden'
|
|
106
140
|
},
|
|
107
|
-
children: icon ?? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.
|
|
141
|
+
children: icon ?? (hasName ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
142
|
+
allowFontScaling: false,
|
|
143
|
+
numberOfLines: 1,
|
|
144
|
+
style: initialStyle,
|
|
145
|
+
children: getInitial(name)
|
|
146
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
|
|
108
147
|
source: _defaultAvatar.default,
|
|
109
148
|
resizeMode: "cover",
|
|
110
149
|
style: {
|
|
@@ -112,7 +151,7 @@ function CircleFallback({
|
|
|
112
151
|
height: size,
|
|
113
152
|
borderRadius: radius
|
|
114
153
|
}
|
|
115
|
-
})
|
|
154
|
+
}))
|
|
116
155
|
});
|
|
117
156
|
}
|
|
118
157
|
const AvatarComponent = ({
|
|
@@ -127,6 +166,7 @@ const AvatarComponent = ({
|
|
|
127
166
|
imageStyle,
|
|
128
167
|
placeholderColor,
|
|
129
168
|
placeholderIcon,
|
|
169
|
+
name,
|
|
130
170
|
onPress,
|
|
131
171
|
testID
|
|
132
172
|
}) => {
|
|
@@ -134,8 +174,12 @@ const AvatarComponent = ({
|
|
|
134
174
|
const theme = (0, _useTheme.useTheme)();
|
|
135
175
|
const placeholderConfig = (0, _placeholderContext.useAvatarPlaceholder)();
|
|
136
176
|
const radius = size / 2;
|
|
137
|
-
const
|
|
138
|
-
|
|
177
|
+
const hasName = typeof name === 'string' && name.trim().length > 0;
|
|
178
|
+
// Priority: explicit placeholderColor > deterministic color from name > theme default.
|
|
179
|
+
const fallbackColor = placeholderColor || (hasName ? getNameColor(name) : theme.colors.backgroundTertiary);
|
|
180
|
+
// When a name is provided, we render an initial instead of invoking the
|
|
181
|
+
// default placeholder-context icon. Explicit placeholderIcon still wins.
|
|
182
|
+
const resolvedPlaceholderIcon = placeholderIcon ?? (hasName ? undefined : placeholderConfig?.icon?.(size * 0.6));
|
|
139
183
|
|
|
140
184
|
// Reset error state when source changes (e.g., list item recycling
|
|
141
185
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -187,6 +231,7 @@ const AvatarComponent = ({
|
|
|
187
231
|
size: size,
|
|
188
232
|
fallbackColor: fallbackColor,
|
|
189
233
|
placeholderIcon: resolvedPlaceholderIcon,
|
|
234
|
+
name: name,
|
|
190
235
|
onError: () => setErrored(true)
|
|
191
236
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
192
237
|
style: [styles.imageContainer, {
|
|
@@ -204,7 +249,8 @@ const AvatarComponent = ({
|
|
|
204
249
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(CircleFallback, {
|
|
205
250
|
size: size,
|
|
206
251
|
fallbackColor: fallbackColor,
|
|
207
|
-
icon: resolvedPlaceholderIcon
|
|
252
|
+
icon: resolvedPlaceholderIcon,
|
|
253
|
+
name: name
|
|
208
254
|
})
|
|
209
255
|
}), verified && verifiedIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
210
256
|
style: [styles.verifiedBadge, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_useTheme","_context","_lazyRequire","_placeholderContext","_defaultAvatar","_interopRequireDefault","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SQUIRCLE_PATH","clipIdCounter","getSvgModule","lazyRequire","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","DEFAULT_AVATAR_IMAGE","resizeMode","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","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":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_useTheme","_context","_lazyRequire","_placeholderContext","_defaultAvatar","_interopRequireDefault","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","NAME_AVATAR_COLORS","getInitial","name","trimmed","trim","firstCodePoint","toUpperCase","getNameColor","hash","length","charCodeAt","index","Math","abs","SQUIRCLE_PATH","clipIdCounter","getSvgModule","lazyRequire","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","hasName","initialStyle","color","fontSize","round","fontWeight","lineHeight","textAlign","includeFontPadding","View","borderRadius","backgroundColor","justifyContent","alignItems","overflow","Text","allowFontScaling","numberOfLines","DEFAULT_AVATAR_IMAGE","resizeMode","AvatarComponent","verified","verifiedIcon","shape","imageStyle","placeholderColor","onPress","testID","errored","setErrored","useState","theme","useTheme","placeholderConfig","useAvatarPlaceholder","colors","backgroundTertiary","resolvedPlaceholderIcon","undefined","prevSourceRef","useRef","prevUriRef","current","imageResolver","useImageResolver","resolvedUri","startsWith","resolvedImageSource","effectiveUri","imageSource","content","container","imageContainer","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":[]}
|
|
@@ -10,8 +10,17 @@ var _reactNative = require("react-native");
|
|
|
10
10
|
* On Android (RN 0.83+), Appearance.setColorScheme has a Kotlin non-null
|
|
11
11
|
* annotation on `style`. Passing null for 'system' crashes.
|
|
12
12
|
* Workaround: resolve the system preference and pass 'light'/'dark' instead.
|
|
13
|
+
*
|
|
14
|
+
* On react-native-web, Appearance.setColorScheme is not implemented at all
|
|
15
|
+
* (it's `undefined`), which crashes with "setColorScheme is not a function".
|
|
16
|
+
* Appearance.getColorScheme() still works on web, so reading the system
|
|
17
|
+
* preference is fine — it's only the setter that's missing. The browser /
|
|
18
|
+
* electron controls the color scheme anyway, so we just bail out on web.
|
|
13
19
|
*/
|
|
14
20
|
function setColorSchemeSafe(mode) {
|
|
21
|
+
if (_reactNative.Platform.OS === 'web') {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
15
24
|
const effectiveMode = mode === 'adaptive' ? 'system' : mode;
|
|
16
25
|
if (effectiveMode === 'system') {
|
|
17
26
|
const resolved = _reactNative.Appearance.getColorScheme() ?? 'light';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","setColorSchemeSafe","mode","effectiveMode","resolved","Appearance","getColorScheme","setColorScheme"],"sourceRoot":"../../../src","sources":["theme/set-color-scheme-safe.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_reactNative","require","setColorSchemeSafe","mode","Platform","OS","effectiveMode","resolved","Appearance","getColorScheme","setColorScheme"],"sourceRoot":"../../../src","sources":["theme/set-color-scheme-safe.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,kBAAkBA,CAACC,IAAe,EAAE;EAClD,IAAIC,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;IACzB;EACF;EAEA,MAAMC,aAAa,GAAGH,IAAI,KAAK,UAAU,GAAG,QAAQ,GAAGA,IAAI;EAC3D,IAAIG,aAAa,KAAK,QAAQ,EAAE;IAC9B,MAAMC,QAAQ,GAAGC,uBAAU,CAACC,cAAc,CAAC,CAAC,IAAI,OAAO;IACvDD,uBAAU,CAACE,cAAc,CAACH,QAAQ,CAAC;EACrC,CAAC,MAAM;IACLC,uBAAU,CAACE,cAAc,CAACJ,aAAa,CAAC;EAC1C;AACF","ignoreList":[]}
|
|
@@ -1,11 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import React, { memo, useMemo, useRef, useState } from 'react';
|
|
4
|
-
import { View, Image, StyleSheet, TouchableOpacity } from 'react-native';
|
|
4
|
+
import { View, Image, StyleSheet, Text, TouchableOpacity } from 'react-native';
|
|
5
5
|
import { useTheme } from "../theme/use-theme.js";
|
|
6
6
|
import { useImageResolver } from "../image-resolver/context.js";
|
|
7
7
|
import { lazyRequire } from "../utils/lazy-require.js";
|
|
8
8
|
import { useAvatarPlaceholder } from "./placeholder-context.js";
|
|
9
|
+
// Google Contacts-inspired palette used to pick a deterministic background
|
|
10
|
+
// color for name-based placeholder avatars.
|
|
11
|
+
const NAME_AVATAR_COLORS = ['#D93025', '#E8710A', '#F9AB00', '#1E8E3E', '#12B5CB', '#1A73E8', '#7627BB', '#C5221F', '#0B8043', '#A142F4'];
|
|
12
|
+
function getInitial(name) {
|
|
13
|
+
const trimmed = name.trim();
|
|
14
|
+
if (!trimmed) return '?';
|
|
15
|
+
const firstCodePoint = [...trimmed][0] ?? '?';
|
|
16
|
+
return firstCodePoint.toUpperCase();
|
|
17
|
+
}
|
|
18
|
+
function getNameColor(name) {
|
|
19
|
+
let hash = 0;
|
|
20
|
+
for (let i = 0; i < name.length; i++) {
|
|
21
|
+
hash = hash * 31 + name.charCodeAt(i) | 0;
|
|
22
|
+
}
|
|
23
|
+
const index = Math.abs(hash) % NAME_AVATAR_COLORS.length;
|
|
24
|
+
// Palette has a fixed, non-empty length, so this lookup always succeeds.
|
|
25
|
+
return NAME_AVATAR_COLORS[index] ?? NAME_AVATAR_COLORS[0];
|
|
26
|
+
}
|
|
27
|
+
|
|
9
28
|
// Built-in default avatar image — used when no source, fallbackSource, or placeholderIcon is provided
|
|
10
29
|
// ESM static import works in both Metro (RN 0.72+) and web bundlers (Vite, webpack).
|
|
11
30
|
import DEFAULT_AVATAR_IMAGE from './default-avatar.jpg';
|
|
@@ -25,6 +44,7 @@ function SquircleImage({
|
|
|
25
44
|
size,
|
|
26
45
|
fallbackColor,
|
|
27
46
|
placeholderIcon,
|
|
47
|
+
name,
|
|
28
48
|
onError
|
|
29
49
|
}) {
|
|
30
50
|
const svg = getSvgModule();
|
|
@@ -33,7 +53,8 @@ function SquircleImage({
|
|
|
33
53
|
return /*#__PURE__*/_jsx(CircleFallback, {
|
|
34
54
|
size: size,
|
|
35
55
|
fallbackColor: fallbackColor,
|
|
36
|
-
icon: placeholderIcon
|
|
56
|
+
icon: placeholderIcon,
|
|
57
|
+
name: name
|
|
37
58
|
});
|
|
38
59
|
}
|
|
39
60
|
const {
|
|
@@ -51,7 +72,8 @@ function SquircleImage({
|
|
|
51
72
|
return /*#__PURE__*/_jsx(CircleFallback, {
|
|
52
73
|
size: size,
|
|
53
74
|
fallbackColor: fallbackColor,
|
|
54
|
-
icon: placeholderIcon
|
|
75
|
+
icon: placeholderIcon,
|
|
76
|
+
name: name
|
|
55
77
|
});
|
|
56
78
|
}
|
|
57
79
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
@@ -85,9 +107,21 @@ function SquircleImage({
|
|
|
85
107
|
function CircleFallback({
|
|
86
108
|
size,
|
|
87
109
|
fallbackColor,
|
|
88
|
-
icon
|
|
110
|
+
icon,
|
|
111
|
+
name
|
|
89
112
|
}) {
|
|
90
113
|
const radius = size / 2;
|
|
114
|
+
// If a name is provided (and no custom icon was supplied), render a
|
|
115
|
+
// centered initial in white instead of the default avatar image.
|
|
116
|
+
const hasName = typeof name === 'string' && name.trim().length > 0;
|
|
117
|
+
const initialStyle = {
|
|
118
|
+
color: '#FFFFFF',
|
|
119
|
+
fontSize: Math.round(size * 0.42),
|
|
120
|
+
fontWeight: '600',
|
|
121
|
+
lineHeight: Math.round(size * 0.48),
|
|
122
|
+
textAlign: 'center',
|
|
123
|
+
includeFontPadding: false
|
|
124
|
+
};
|
|
91
125
|
return /*#__PURE__*/_jsx(View, {
|
|
92
126
|
style: {
|
|
93
127
|
width: size,
|
|
@@ -98,7 +132,12 @@ function CircleFallback({
|
|
|
98
132
|
alignItems: 'center',
|
|
99
133
|
overflow: 'hidden'
|
|
100
134
|
},
|
|
101
|
-
children: icon ?? /*#__PURE__*/_jsx(
|
|
135
|
+
children: icon ?? (hasName ? /*#__PURE__*/_jsx(Text, {
|
|
136
|
+
allowFontScaling: false,
|
|
137
|
+
numberOfLines: 1,
|
|
138
|
+
style: initialStyle,
|
|
139
|
+
children: getInitial(name)
|
|
140
|
+
}) : /*#__PURE__*/_jsx(Image, {
|
|
102
141
|
source: DEFAULT_AVATAR_IMAGE,
|
|
103
142
|
resizeMode: "cover",
|
|
104
143
|
style: {
|
|
@@ -106,7 +145,7 @@ function CircleFallback({
|
|
|
106
145
|
height: size,
|
|
107
146
|
borderRadius: radius
|
|
108
147
|
}
|
|
109
|
-
})
|
|
148
|
+
}))
|
|
110
149
|
});
|
|
111
150
|
}
|
|
112
151
|
const AvatarComponent = ({
|
|
@@ -121,6 +160,7 @@ const AvatarComponent = ({
|
|
|
121
160
|
imageStyle,
|
|
122
161
|
placeholderColor,
|
|
123
162
|
placeholderIcon,
|
|
163
|
+
name,
|
|
124
164
|
onPress,
|
|
125
165
|
testID
|
|
126
166
|
}) => {
|
|
@@ -128,8 +168,12 @@ const AvatarComponent = ({
|
|
|
128
168
|
const theme = useTheme();
|
|
129
169
|
const placeholderConfig = useAvatarPlaceholder();
|
|
130
170
|
const radius = size / 2;
|
|
131
|
-
const
|
|
132
|
-
|
|
171
|
+
const hasName = typeof name === 'string' && name.trim().length > 0;
|
|
172
|
+
// Priority: explicit placeholderColor > deterministic color from name > theme default.
|
|
173
|
+
const fallbackColor = placeholderColor || (hasName ? getNameColor(name) : theme.colors.backgroundTertiary);
|
|
174
|
+
// When a name is provided, we render an initial instead of invoking the
|
|
175
|
+
// default placeholder-context icon. Explicit placeholderIcon still wins.
|
|
176
|
+
const resolvedPlaceholderIcon = placeholderIcon ?? (hasName ? undefined : placeholderConfig?.icon?.(size * 0.6));
|
|
133
177
|
|
|
134
178
|
// Reset error state when source changes (e.g., list item recycling
|
|
135
179
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -181,6 +225,7 @@ const AvatarComponent = ({
|
|
|
181
225
|
size: size,
|
|
182
226
|
fallbackColor: fallbackColor,
|
|
183
227
|
placeholderIcon: resolvedPlaceholderIcon,
|
|
228
|
+
name: name,
|
|
184
229
|
onError: () => setErrored(true)
|
|
185
230
|
}) : /*#__PURE__*/_jsx(View, {
|
|
186
231
|
style: [styles.imageContainer, {
|
|
@@ -198,7 +243,8 @@ const AvatarComponent = ({
|
|
|
198
243
|
}) : /*#__PURE__*/_jsx(CircleFallback, {
|
|
199
244
|
size: size,
|
|
200
245
|
fallbackColor: fallbackColor,
|
|
201
|
-
icon: resolvedPlaceholderIcon
|
|
246
|
+
icon: resolvedPlaceholderIcon,
|
|
247
|
+
name: name
|
|
202
248
|
})
|
|
203
249
|
}), verified && verifiedIcon && /*#__PURE__*/_jsx(View, {
|
|
204
250
|
style: [styles.verifiedBadge, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","memo","useMemo","useRef","useState","View","Image","StyleSheet","TouchableOpacity","useTheme","useImageResolver","lazyRequire","useAvatarPlaceholder","DEFAULT_AVATAR_IMAGE","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","SQUIRCLE_PATH","clipIdCounter","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","resizeMode","AvatarComponent","verified","verifiedIcon","shape","imageStyle","placeholderColor","onPress","testID","errored","setErrored","theme","placeholderConfig","colors","backgroundTertiary","resolvedPlaceholderIcon","prevSourceRef","prevUriRef","current","imageResolver","resolvedUri","startsWith","resolvedImageSource","
|
|
1
|
+
{"version":3,"names":["React","memo","useMemo","useRef","useState","View","Image","StyleSheet","Text","TouchableOpacity","useTheme","useImageResolver","lazyRequire","useAvatarPlaceholder","NAME_AVATAR_COLORS","getInitial","name","trimmed","trim","firstCodePoint","toUpperCase","getNameColor","hash","i","length","charCodeAt","index","Math","abs","DEFAULT_AVATAR_IMAGE","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","SQUIRCLE_PATH","clipIdCounter","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","hasName","initialStyle","color","fontSize","round","fontWeight","lineHeight","textAlign","includeFontPadding","borderRadius","backgroundColor","justifyContent","alignItems","overflow","allowFontScaling","numberOfLines","resizeMode","AvatarComponent","verified","verifiedIcon","shape","imageStyle","placeholderColor","onPress","testID","errored","setErrored","theme","placeholderConfig","colors","backgroundTertiary","resolvedPlaceholderIcon","undefined","prevSourceRef","prevUriRef","current","imageResolver","resolvedUri","startsWith","resolvedImageSource","effectiveUri","imageSource","content","container","imageContainer","absoluteFillObject","verifiedBadge","create","position","bottom","right","zIndex","opacity","Avatar","displayName"],"sourceRoot":"../../../src","sources":["avatar/Avatar.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { Appearance } from 'react-native';
|
|
3
|
+
import { Appearance, Platform } from 'react-native';
|
|
4
4
|
/**
|
|
5
5
|
* Safely set the color scheme via Appearance API.
|
|
6
6
|
* On Android (RN 0.83+), Appearance.setColorScheme has a Kotlin non-null
|
|
7
7
|
* annotation on `style`. Passing null for 'system' crashes.
|
|
8
8
|
* Workaround: resolve the system preference and pass 'light'/'dark' instead.
|
|
9
|
+
*
|
|
10
|
+
* On react-native-web, Appearance.setColorScheme is not implemented at all
|
|
11
|
+
* (it's `undefined`), which crashes with "setColorScheme is not a function".
|
|
12
|
+
* Appearance.getColorScheme() still works on web, so reading the system
|
|
13
|
+
* preference is fine — it's only the setter that's missing. The browser /
|
|
14
|
+
* electron controls the color scheme anyway, so we just bail out on web.
|
|
9
15
|
*/
|
|
10
16
|
export function setColorSchemeSafe(mode) {
|
|
17
|
+
if (Platform.OS === 'web') {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
11
20
|
const effectiveMode = mode === 'adaptive' ? 'system' : mode;
|
|
12
21
|
if (effectiveMode === 'system') {
|
|
13
22
|
const resolved = Appearance.getColorScheme() ?? 'light';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Appearance","setColorSchemeSafe","mode","effectiveMode","resolved","getColorScheme","setColorScheme"],"sourceRoot":"../../../src","sources":["theme/set-color-scheme-safe.ts"],"mappings":";;AAAA,SAASA,UAAU,
|
|
1
|
+
{"version":3,"names":["Appearance","Platform","setColorSchemeSafe","mode","OS","effectiveMode","resolved","getColorScheme","setColorScheme"],"sourceRoot":"../../../src","sources":["theme/set-color-scheme-safe.ts"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,QAAQ,QAAQ,cAAc;AAGnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAACC,IAAe,EAAE;EAClD,IAAIF,QAAQ,CAACG,EAAE,KAAK,KAAK,EAAE;IACzB;EACF;EAEA,MAAMC,aAAa,GAAGF,IAAI,KAAK,UAAU,GAAG,QAAQ,GAAGA,IAAI;EAC3D,IAAIE,aAAa,KAAK,QAAQ,EAAE;IAC9B,MAAMC,QAAQ,GAAGN,UAAU,CAACO,cAAc,CAAC,CAAC,IAAI,OAAO;IACvDP,UAAU,CAACQ,cAAc,CAACF,QAAQ,CAAC;EACrC,CAAC,MAAM;IACLN,UAAU,CAACQ,cAAc,CAACH,aAAa,CAAC;EAC1C;AACF","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;AAQ/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAsT3C,eAAO,MAAM,MAAM,yCAAwB,CAAC"}
|
|
@@ -28,6 +28,13 @@ export interface AvatarProps {
|
|
|
28
28
|
placeholderColor?: string;
|
|
29
29
|
/** Custom icon rendered inside the placeholder circle when no image is available */
|
|
30
30
|
placeholderIcon?: ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* Contact/user name used to derive a deterministic initial and background color.
|
|
33
|
+
* When no image resolves (missing `source`/`uri` or image error), the Avatar renders
|
|
34
|
+
* a colored circle with the first letter of the name in white.
|
|
35
|
+
* Consumers can still override via `placeholderColor` / `placeholderIcon`.
|
|
36
|
+
*/
|
|
37
|
+
name?: string;
|
|
31
38
|
/** Press handler — wraps avatar in TouchableOpacity when provided */
|
|
32
39
|
onPress?: () => void;
|
|
33
40
|
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,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
|
+
{"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;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -4,6 +4,12 @@ import type { ThemeMode } from './types';
|
|
|
4
4
|
* On Android (RN 0.83+), Appearance.setColorScheme has a Kotlin non-null
|
|
5
5
|
* annotation on `style`. Passing null for 'system' crashes.
|
|
6
6
|
* Workaround: resolve the system preference and pass 'light'/'dark' instead.
|
|
7
|
+
*
|
|
8
|
+
* On react-native-web, Appearance.setColorScheme is not implemented at all
|
|
9
|
+
* (it's `undefined`), which crashes with "setColorScheme is not a function".
|
|
10
|
+
* Appearance.getColorScheme() still works on web, so reading the system
|
|
11
|
+
* preference is fine — it's only the setter that's missing. The browser /
|
|
12
|
+
* electron controls the color scheme anyway, so we just bail out on web.
|
|
7
13
|
*/
|
|
8
14
|
export declare function setColorSchemeSafe(mode: ThemeMode): void;
|
|
9
15
|
//# sourceMappingURL=set-color-scheme-safe.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-color-scheme-safe.d.ts","sourceRoot":"","sources":["../../../../src/theme/set-color-scheme-safe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"set-color-scheme-safe.d.ts","sourceRoot":"","sources":["../../../../src/theme/set-color-scheme-safe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,QAYjD"}
|
|
@@ -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;AAQ/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAsT3C,eAAO,MAAM,MAAM,yCAAwB,CAAC"}
|
|
@@ -28,6 +28,13 @@ export interface AvatarProps {
|
|
|
28
28
|
placeholderColor?: string;
|
|
29
29
|
/** Custom icon rendered inside the placeholder circle when no image is available */
|
|
30
30
|
placeholderIcon?: ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* Contact/user name used to derive a deterministic initial and background color.
|
|
33
|
+
* When no image resolves (missing `source`/`uri` or image error), the Avatar renders
|
|
34
|
+
* a colored circle with the first letter of the name in white.
|
|
35
|
+
* Consumers can still override via `placeholderColor` / `placeholderIcon`.
|
|
36
|
+
*/
|
|
37
|
+
name?: string;
|
|
31
38
|
/** Press handler — wraps avatar in TouchableOpacity when provided */
|
|
32
39
|
onPress?: () => void;
|
|
33
40
|
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,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
|
+
{"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;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -4,6 +4,12 @@ import type { ThemeMode } from './types';
|
|
|
4
4
|
* On Android (RN 0.83+), Appearance.setColorScheme has a Kotlin non-null
|
|
5
5
|
* annotation on `style`. Passing null for 'system' crashes.
|
|
6
6
|
* Workaround: resolve the system preference and pass 'light'/'dark' instead.
|
|
7
|
+
*
|
|
8
|
+
* On react-native-web, Appearance.setColorScheme is not implemented at all
|
|
9
|
+
* (it's `undefined`), which crashes with "setColorScheme is not a function".
|
|
10
|
+
* Appearance.getColorScheme() still works on web, so reading the system
|
|
11
|
+
* preference is fine — it's only the setter that's missing. The browser /
|
|
12
|
+
* electron controls the color scheme anyway, so we just bail out on web.
|
|
7
13
|
*/
|
|
8
14
|
export declare function setColorSchemeSafe(mode: ThemeMode): void;
|
|
9
15
|
//# sourceMappingURL=set-color-scheme-safe.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-color-scheme-safe.d.ts","sourceRoot":"","sources":["../../../../src/theme/set-color-scheme-safe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"set-color-scheme-safe.d.ts","sourceRoot":"","sources":["../../../../src/theme/set-color-scheme-safe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,QAYjD"}
|
package/package.json
CHANGED
package/src/avatar/Avatar.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { memo, useMemo, useRef, useState } from 'react';
|
|
2
|
-
import { View, Image, StyleSheet, TouchableOpacity } from 'react-native';
|
|
2
|
+
import { View, Image, StyleSheet, Text, TouchableOpacity } from 'react-native';
|
|
3
|
+
import type { TextStyle } from 'react-native';
|
|
3
4
|
|
|
4
5
|
import { useTheme } from '../theme/use-theme';
|
|
5
6
|
import { useImageResolver } from '../image-resolver/context';
|
|
@@ -7,6 +8,30 @@ import { lazyRequire } from '../utils/lazy-require';
|
|
|
7
8
|
import { useAvatarPlaceholder } from './placeholder-context';
|
|
8
9
|
import type { AvatarProps } from './types';
|
|
9
10
|
|
|
11
|
+
// Google Contacts-inspired palette used to pick a deterministic background
|
|
12
|
+
// color for name-based placeholder avatars.
|
|
13
|
+
const NAME_AVATAR_COLORS = [
|
|
14
|
+
'#D93025', '#E8710A', '#F9AB00', '#1E8E3E', '#12B5CB',
|
|
15
|
+
'#1A73E8', '#7627BB', '#C5221F', '#0B8043', '#A142F4',
|
|
16
|
+
] as const;
|
|
17
|
+
|
|
18
|
+
function getInitial(name: string): string {
|
|
19
|
+
const trimmed = name.trim();
|
|
20
|
+
if (!trimmed) return '?';
|
|
21
|
+
const firstCodePoint = [...trimmed][0] ?? '?';
|
|
22
|
+
return firstCodePoint.toUpperCase();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getNameColor(name: string): string {
|
|
26
|
+
let hash = 0;
|
|
27
|
+
for (let i = 0; i < name.length; i++) {
|
|
28
|
+
hash = (hash * 31 + name.charCodeAt(i)) | 0;
|
|
29
|
+
}
|
|
30
|
+
const index = Math.abs(hash) % NAME_AVATAR_COLORS.length;
|
|
31
|
+
// Palette has a fixed, non-empty length, so this lookup always succeeds.
|
|
32
|
+
return NAME_AVATAR_COLORS[index] ?? NAME_AVATAR_COLORS[0];
|
|
33
|
+
}
|
|
34
|
+
|
|
10
35
|
// Built-in default avatar image — used when no source, fallbackSource, or placeholderIcon is provided
|
|
11
36
|
// ESM static import works in both Metro (RN 0.72+) and web bundlers (Vite, webpack).
|
|
12
37
|
import DEFAULT_AVATAR_IMAGE from './default-avatar.jpg';
|
|
@@ -31,6 +56,7 @@ function SquircleImage({
|
|
|
31
56
|
size,
|
|
32
57
|
fallbackColor,
|
|
33
58
|
placeholderIcon,
|
|
59
|
+
name,
|
|
34
60
|
onError,
|
|
35
61
|
}: {
|
|
36
62
|
uri?: string;
|
|
@@ -38,12 +64,13 @@ function SquircleImage({
|
|
|
38
64
|
size: number;
|
|
39
65
|
fallbackColor: string;
|
|
40
66
|
placeholderIcon?: React.ReactNode;
|
|
67
|
+
name?: string;
|
|
41
68
|
onError: () => void;
|
|
42
69
|
}) {
|
|
43
70
|
const svg = getSvgModule();
|
|
44
71
|
if (!svg) {
|
|
45
72
|
// Fallback to circle if react-native-svg is not installed
|
|
46
|
-
return <CircleFallback size={size} fallbackColor={fallbackColor} icon={placeholderIcon} />;
|
|
73
|
+
return <CircleFallback size={size} fallbackColor={fallbackColor} icon={placeholderIcon} name={name} />;
|
|
47
74
|
}
|
|
48
75
|
|
|
49
76
|
const { default: Svg, Defs, ClipPath, Path, Image: SvgImage } = svg;
|
|
@@ -51,7 +78,7 @@ function SquircleImage({
|
|
|
51
78
|
|
|
52
79
|
const href = uri ? { uri } : fallbackSource;
|
|
53
80
|
if (!href) {
|
|
54
|
-
return <CircleFallback size={size} fallbackColor={fallbackColor} icon={placeholderIcon} />;
|
|
81
|
+
return <CircleFallback size={size} fallbackColor={fallbackColor} icon={placeholderIcon} name={name} />;
|
|
55
82
|
}
|
|
56
83
|
|
|
57
84
|
return (
|
|
@@ -82,8 +109,29 @@ function SquircleImage({
|
|
|
82
109
|
);
|
|
83
110
|
}
|
|
84
111
|
|
|
85
|
-
function CircleFallback({
|
|
112
|
+
function CircleFallback({
|
|
113
|
+
size,
|
|
114
|
+
fallbackColor,
|
|
115
|
+
icon,
|
|
116
|
+
name,
|
|
117
|
+
}: {
|
|
118
|
+
size: number;
|
|
119
|
+
fallbackColor: string;
|
|
120
|
+
icon?: React.ReactNode;
|
|
121
|
+
name?: string;
|
|
122
|
+
}) {
|
|
86
123
|
const radius = size / 2;
|
|
124
|
+
// If a name is provided (and no custom icon was supplied), render a
|
|
125
|
+
// centered initial in white instead of the default avatar image.
|
|
126
|
+
const hasName = typeof name === 'string' && name.trim().length > 0;
|
|
127
|
+
const initialStyle: TextStyle = {
|
|
128
|
+
color: '#FFFFFF',
|
|
129
|
+
fontSize: Math.round(size * 0.42),
|
|
130
|
+
fontWeight: '600',
|
|
131
|
+
lineHeight: Math.round(size * 0.48),
|
|
132
|
+
textAlign: 'center',
|
|
133
|
+
includeFontPadding: false,
|
|
134
|
+
};
|
|
87
135
|
return (
|
|
88
136
|
<View
|
|
89
137
|
style={{
|
|
@@ -96,13 +144,21 @@ function CircleFallback({ size, fallbackColor, icon }: { size: number; fallbackC
|
|
|
96
144
|
overflow: 'hidden',
|
|
97
145
|
}}
|
|
98
146
|
>
|
|
99
|
-
{icon ?? (
|
|
147
|
+
{icon ?? (hasName ? (
|
|
148
|
+
<Text
|
|
149
|
+
allowFontScaling={false}
|
|
150
|
+
numberOfLines={1}
|
|
151
|
+
style={initialStyle}
|
|
152
|
+
>
|
|
153
|
+
{getInitial(name)}
|
|
154
|
+
</Text>
|
|
155
|
+
) : (
|
|
100
156
|
<Image
|
|
101
157
|
source={DEFAULT_AVATAR_IMAGE}
|
|
102
158
|
resizeMode="cover"
|
|
103
159
|
style={{ width: size, height: size, borderRadius: radius }}
|
|
104
160
|
/>
|
|
105
|
-
)}
|
|
161
|
+
))}
|
|
106
162
|
</View>
|
|
107
163
|
);
|
|
108
164
|
}
|
|
@@ -119,6 +175,7 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
119
175
|
imageStyle,
|
|
120
176
|
placeholderColor,
|
|
121
177
|
placeholderIcon,
|
|
178
|
+
name,
|
|
122
179
|
onPress,
|
|
123
180
|
testID,
|
|
124
181
|
}) => {
|
|
@@ -126,8 +183,14 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
126
183
|
const theme = useTheme();
|
|
127
184
|
const placeholderConfig = useAvatarPlaceholder();
|
|
128
185
|
const radius = size / 2;
|
|
129
|
-
const
|
|
130
|
-
|
|
186
|
+
const hasName = typeof name === 'string' && name.trim().length > 0;
|
|
187
|
+
// Priority: explicit placeholderColor > deterministic color from name > theme default.
|
|
188
|
+
const fallbackColor =
|
|
189
|
+
placeholderColor || (hasName ? getNameColor(name) : theme.colors.backgroundTertiary);
|
|
190
|
+
// When a name is provided, we render an initial instead of invoking the
|
|
191
|
+
// default placeholder-context icon. Explicit placeholderIcon still wins.
|
|
192
|
+
const resolvedPlaceholderIcon =
|
|
193
|
+
placeholderIcon ?? (hasName ? undefined : placeholderConfig?.icon?.(size * 0.6));
|
|
131
194
|
|
|
132
195
|
// Reset error state when source changes (e.g., list item recycling
|
|
133
196
|
// or async URL resolution replacing an initial file ID).
|
|
@@ -179,6 +242,7 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
179
242
|
size={size}
|
|
180
243
|
fallbackColor={fallbackColor}
|
|
181
244
|
placeholderIcon={resolvedPlaceholderIcon}
|
|
245
|
+
name={name}
|
|
182
246
|
onError={() => setErrored(true)}
|
|
183
247
|
/>
|
|
184
248
|
) : (
|
|
@@ -191,7 +255,12 @@ const AvatarComponent: React.FC<AvatarProps> = ({
|
|
|
191
255
|
style={[StyleSheet.absoluteFillObject, { borderRadius: radius }, imageStyle]}
|
|
192
256
|
/>
|
|
193
257
|
) : (
|
|
194
|
-
<CircleFallback
|
|
258
|
+
<CircleFallback
|
|
259
|
+
size={size}
|
|
260
|
+
fallbackColor={fallbackColor}
|
|
261
|
+
icon={resolvedPlaceholderIcon}
|
|
262
|
+
name={name}
|
|
263
|
+
/>
|
|
195
264
|
)}
|
|
196
265
|
</View>
|
|
197
266
|
)}
|
package/src/avatar/types.ts
CHANGED
|
@@ -30,6 +30,13 @@ export interface AvatarProps {
|
|
|
30
30
|
placeholderColor?: string;
|
|
31
31
|
/** Custom icon rendered inside the placeholder circle when no image is available */
|
|
32
32
|
placeholderIcon?: ReactNode;
|
|
33
|
+
/**
|
|
34
|
+
* Contact/user name used to derive a deterministic initial and background color.
|
|
35
|
+
* When no image resolves (missing `source`/`uri` or image error), the Avatar renders
|
|
36
|
+
* a colored circle with the first letter of the name in white.
|
|
37
|
+
* Consumers can still override via `placeholderColor` / `placeholderIcon`.
|
|
38
|
+
*/
|
|
39
|
+
name?: string;
|
|
33
40
|
/** Press handler — wraps avatar in TouchableOpacity when provided */
|
|
34
41
|
onPress?: () => void;
|
|
35
42
|
testID?: string;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Appearance, Platform } from 'react-native';
|
|
2
|
-
import type { ColorSchemeName } from 'react-native';
|
|
3
2
|
import type { ThemeMode } from './types';
|
|
4
3
|
|
|
5
4
|
/**
|
|
@@ -7,8 +6,18 @@ import type { ThemeMode } from './types';
|
|
|
7
6
|
* On Android (RN 0.83+), Appearance.setColorScheme has a Kotlin non-null
|
|
8
7
|
* annotation on `style`. Passing null for 'system' crashes.
|
|
9
8
|
* Workaround: resolve the system preference and pass 'light'/'dark' instead.
|
|
9
|
+
*
|
|
10
|
+
* On react-native-web, Appearance.setColorScheme is not implemented at all
|
|
11
|
+
* (it's `undefined`), which crashes with "setColorScheme is not a function".
|
|
12
|
+
* Appearance.getColorScheme() still works on web, so reading the system
|
|
13
|
+
* preference is fine — it's only the setter that's missing. The browser /
|
|
14
|
+
* electron controls the color scheme anyway, so we just bail out on web.
|
|
10
15
|
*/
|
|
11
16
|
export function setColorSchemeSafe(mode: ThemeMode) {
|
|
17
|
+
if (Platform.OS === 'web') {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
12
21
|
const effectiveMode = mode === 'adaptive' ? 'system' : mode;
|
|
13
22
|
if (effectiveMode === 'system') {
|
|
14
23
|
const resolved = Appearance.getColorScheme() ?? 'light';
|