Skip to content

Commit 8513363

Browse files
authored
Merge pull request #281 from iteratehq/mike/dynamic-button-text
feat: add dynamic button text to the prompt
2 parents 50b0b53 + 8603be6 commit 8513363

File tree

3 files changed

+208
-67
lines changed

3 files changed

+208
-67
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
GEM
2+
remote: https://rubygems.org/
3+
specs:
4+
CFPropertyList (3.0.7)
5+
base64
6+
nkf
7+
rexml
8+
activesupport (6.1.7.10)
9+
concurrent-ruby (~> 1.0, >= 1.0.2)
10+
i18n (>= 1.6, < 2)
11+
minitest (>= 5.1)
12+
tzinfo (~> 2.0)
13+
zeitwerk (~> 2.3)
14+
addressable (2.8.7)
15+
public_suffix (>= 2.0.2, < 7.0)
16+
algoliasearch (1.27.5)
17+
httpclient (~> 2.8, >= 2.8.3)
18+
json (>= 1.5.1)
19+
atomos (0.1.3)
20+
base64 (0.3.0)
21+
benchmark (0.5.0)
22+
bigdecimal (3.3.1)
23+
claide (1.1.0)
24+
cocoapods (1.15.2)
25+
addressable (~> 2.8)
26+
claide (>= 1.0.2, < 2.0)
27+
cocoapods-core (= 1.15.2)
28+
cocoapods-deintegrate (>= 1.0.3, < 2.0)
29+
cocoapods-downloader (>= 2.1, < 3.0)
30+
cocoapods-plugins (>= 1.0.0, < 2.0)
31+
cocoapods-search (>= 1.0.0, < 2.0)
32+
cocoapods-trunk (>= 1.6.0, < 2.0)
33+
cocoapods-try (>= 1.1.0, < 2.0)
34+
colored2 (~> 3.1)
35+
escape (~> 0.0.4)
36+
fourflusher (>= 2.3.0, < 3.0)
37+
gh_inspector (~> 1.0)
38+
molinillo (~> 0.8.0)
39+
nap (~> 1.0)
40+
ruby-macho (>= 2.3.0, < 3.0)
41+
xcodeproj (>= 1.23.0, < 2.0)
42+
cocoapods-core (1.15.2)
43+
activesupport (>= 5.0, < 8)
44+
addressable (~> 2.8)
45+
algoliasearch (~> 1.0)
46+
concurrent-ruby (~> 1.1)
47+
fuzzy_match (~> 2.0.4)
48+
nap (~> 1.0)
49+
netrc (~> 0.11)
50+
public_suffix (~> 4.0)
51+
typhoeus (~> 1.0)
52+
cocoapods-deintegrate (1.0.5)
53+
cocoapods-downloader (2.1)
54+
cocoapods-plugins (1.0.0)
55+
nap
56+
cocoapods-search (1.0.1)
57+
cocoapods-trunk (1.6.0)
58+
nap (>= 0.8, < 2.0)
59+
netrc (~> 0.11)
60+
cocoapods-try (1.2.0)
61+
colored2 (3.1.2)
62+
concurrent-ruby (1.3.3)
63+
escape (0.0.4)
64+
ethon (0.15.0)
65+
ffi (>= 1.15.0)
66+
ffi (1.17.2)
67+
fourflusher (2.3.1)
68+
fuzzy_match (2.0.4)
69+
gh_inspector (1.1.3)
70+
httpclient (2.9.0)
71+
mutex_m
72+
i18n (1.14.7)
73+
concurrent-ruby (~> 1.0)
74+
json (2.7.6)
75+
logger (1.7.0)
76+
minitest (5.25.4)
77+
molinillo (0.8.0)
78+
mutex_m (0.3.0)
79+
nanaimo (0.3.0)
80+
nap (1.1.0)
81+
netrc (0.11.0)
82+
nkf (0.2.0)
83+
public_suffix (4.0.7)
84+
rexml (3.4.4)
85+
ruby-macho (2.5.1)
86+
typhoeus (1.5.0)
87+
ethon (>= 0.9.0, < 0.16.0)
88+
tzinfo (2.0.6)
89+
concurrent-ruby (~> 1.0)
90+
xcodeproj (1.25.1)
91+
CFPropertyList (>= 2.3.3, < 4.0)
92+
atomos (~> 0.1.3)
93+
claide (>= 1.0.2, < 2.0)
94+
colored2 (~> 3.1)
95+
nanaimo (~> 0.3.0)
96+
rexml (>= 3.3.6, < 4.0)
97+
zeitwerk (2.6.18)
98+
99+
PLATFORMS
100+
ruby
101+
102+
DEPENDENCIES
103+
activesupport (>= 6.1.7.5, != 7.1.0)
104+
benchmark
105+
bigdecimal
106+
cocoapods (>= 1.13, != 1.15.1, != 1.15.0)
107+
concurrent-ruby (< 1.3.4)
108+
logger
109+
mutex_m
110+
xcodeproj (< 1.26.0)
111+
112+
RUBY VERSION
113+
ruby 2.6.10p210
114+
115+
BUNDLED WITH
116+
1.17.2

examples/SimpleExample/ios/Podfile.lock

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2389,7 +2389,7 @@ DEPENDENCIES:
23892389
- React-logger (from `../node_modules/react-native/ReactCommon/logger`)
23902390
- React-Mapbuffer (from `../node_modules/react-native/ReactCommon`)
23912391
- React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)
2392-
- react-native-encrypted-storage (from `../../../node_modules/react-native-encrypted-storage`)
2392+
- react-native-encrypted-storage (from `../node_modules/react-native-encrypted-storage`)
23932393
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
23942394
- react-native-webview (from `../node_modules/react-native-webview`)
23952395
- React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
@@ -2512,7 +2512,7 @@ EXTERNAL SOURCES:
25122512
React-microtasksnativemodule:
25132513
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
25142514
react-native-encrypted-storage:
2515-
:path: "../../../node_modules/react-native-encrypted-storage"
2515+
:path: "../node_modules/react-native-encrypted-storage"
25162516
react-native-safe-area-context:
25172517
:path: "../node_modules/react-native-safe-area-context"
25182518
react-native-webview:
@@ -2588,75 +2588,75 @@ SPEC CHECKSUMS:
25882588
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
25892589
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
25902590
hermes-engine: 4f8246b1f6d79f625e0d99472d1f3a71da4d28ca
2591-
RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669
2591+
RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f
25922592
RCTDeprecation: c4b9e2fd0ab200e3af72b013ed6113187c607077
25932593
RCTRequired: e97dd5dafc1db8094e63bc5031e0371f092ae92a
25942594
RCTTypeSafety: 720403058b7c1380c6a3ae5706981d6362962c89
25952595
React: f1486d005993b0af01943af1850d3d4f3b597545
25962596
React-callinvoker: 133f69368c8559e744efa345223625d412f5dfbe
2597-
React-Core: 559823921b4f294c2840fa8238ca958a29ddc211
2598-
React-CoreModules: c41e7bbfabbc420783bb926f45837a0d5e53341e
2599-
React-cxxreact: 9cb9fa738274a1b36b97ede09c8a6717dec1a20b
2597+
React-Core: d6d8c1fd33697cec596d33b820456505ee305686
2598+
React-CoreModules: 81ab751a7668ba161440f9623b994e1a6a3019fe
2599+
React-cxxreact: 16f2a2751d0dce8b569f23c1914edc90f655b01b
26002600
React-debug: e01581e1589f329e61c95b332bf7f4969b10564b
2601-
React-defaultsnativemodule: bbb39447caa6b6cf9405fa0099f828c083640faa
2602-
React-domnativemodule: 03744d12b6d56d098531a933730bf1d4cb79bdfb
2603-
React-Fabric: 530b3993a12a96e8a7cdb9f0ef48e605277b572e
2604-
React-FabricComponents: 271ec2a9b2c00ac66fd6d1fd24e9e964d907751d
2605-
React-FabricImage: d0af66e976dbab7f8b81e36dd369fc70727d2695
2606-
React-featureflags: 269704c8eff86e0485c9d384e286350fcda6eb70
2607-
React-featureflagsnativemodule: db1e5d88a912fb08a5ece33fcf64e1b732da8467
2608-
React-graphics: b19d03a01b0722b4dc82f47acb56dc3ed41937e7
2609-
React-hermes: 811606c0aca5a3f9c6fa8e4994e02ca8f677e68e
2610-
React-idlecallbacksnativemodule: 3a3df629cd50046c7e4354f9025aefe8f2c84601
2611-
React-ImageManager: 0d53866c63132791e37bb2373f93044fdef14aa3
2612-
React-jserrorhandler: d5700d6ab7162fd575287502a3c5d601d98e7f09
2613-
React-jsi: ece95417fedbed0e7153a855cb8342b7c72ab75e
2614-
React-jsiexecutor: 2b0bb644b533df2f5c0cd6ade9a4560d0bf1dd84
2615-
React-jsinspector: 0c160f8510a8852bdf2dac12f0b1949efc18200b
2616-
React-jsinspectorcdp: f4b84409f453f61ddd8614ad45139bc594ec6bb5
2617-
React-jsinspectornetwork: 8f2f0ca8c871ca19b571f426002c0012e7fb2aee
2618-
React-jsinspectortracing: 33f6b977eb8a4bc1e3d1a4b948809aca083143f9
2619-
React-jsitooling: 2c61529b589e17229a9f0a4a4fc35aa7ad495850
2620-
React-jsitracing: 838a7b0c013c4aff7d382d7fdc78cf442013ba1d
2621-
React-logger: 7aef4d74123e5e3d267e5af1fbf5135b5a0d8381
2622-
React-Mapbuffer: 91e0eab42a6ae7f3e34091a126d70fc53bd3823e
2623-
React-microtasksnativemodule: 1ead4fe154df3b1ba34b5a9e35ef3c4bdfa72ccb
2624-
react-native-encrypted-storage: 569d114e329b1c2c2d9f8c84bcdbe4478dda2258
2625-
react-native-safe-area-context: c6e2edd1c1da07bdce287fa9d9e60c5f7b514616
2626-
react-native-webview: ec195db71ebf55705d7b46a7da5f1b1746bb7efd
2627-
React-NativeModulesApple: eff2eba56030eb0d107b1642b8f853bc36a833ac
2601+
React-defaultsnativemodule: e956b1d8fe15cc79d23061db229bf88170565f2f
2602+
React-domnativemodule: a18b0f7a31b9c75f12fa369baece5542d1265b36
2603+
React-Fabric: c0237a32c3c0dbea2d2b294c8e95605e1dfe2f57
2604+
React-FabricComponents: 65b03884bd5d9f24c79a631d7d26f0fa079bc4aa
2605+
React-FabricImage: de1ea2f2a0b32ad02e5cbb64827d1eec0439cf0d
2606+
React-featureflags: 02de9c35256cc624269b01d670d99e1fd706ea8d
2607+
React-featureflagsnativemodule: 8b84e67edbaa7b9318390c5bd3ae19790a74f356
2608+
React-graphics: 004b40c1b236ea3bb8de6693439bef9797922ba9
2609+
React-hermes: 2179a018b2f86652f6f33ef23efd9e5ac284b247
2610+
React-idlecallbacksnativemodule: f54ea68f984b12e42feed1e7110623b2c38df4d1
2611+
React-ImageManager: 9dd04b7b62bc5397f876ca5fb1b712e700ce390c
2612+
React-jserrorhandler: 2f90bf50fffea1d012e7f3d717c6adf748b1813d
2613+
React-jsi: b27208f8866e53238534f65f304903e4eff25e05
2614+
React-jsiexecutor: 1d3e827797f592c393860dea91aaa6d53c7715e7
2615+
React-jsinspector: bda319277ae779bc476b736fe3a497c6aed304cd
2616+
React-jsinspectorcdp: 69e1736edfd5420037680b7b4557fa748c3c8216
2617+
React-jsinspectornetwork: 7aa707b057c6129b4af59e0c9160436bbab25022
2618+
React-jsinspectortracing: b4a8a328ad2697f9638daa4b7cc054e0303fa47f
2619+
React-jsitooling: a6c7e2829437b28665e97a398b3374d443125e24
2620+
React-jsitracing: d87ae17dd0eef7844e605945da926c5433fe2b51
2621+
React-logger: d27dd2000f520bf891d24f6e141cde34df41f0ee
2622+
React-Mapbuffer: 0746ffab5ac0f49b7c9347338e3d0c1d9dd634c8
2623+
React-microtasksnativemodule: b0fb3f97372df39bda3e657536039f1af227cc29
2624+
react-native-encrypted-storage: db300a3f2f0aba1e818417c1c0a6be549038deb7
2625+
react-native-safe-area-context: 6d8a7b750e496e37bda47c938320bf2c734d441f
2626+
react-native-webview: 9f111dfbcfc826084d6c507f569e5e03342ee1c1
2627+
React-NativeModulesApple: 9ec9240159974c94886ebbe4caec18e3395f6aef
26282628
React-oscompat: b12c633e9c00f1f99467b1e0e0b8038895dae436
2629-
React-perflogger: 58d12c4e5df1403030c97b9c621375c312cca454
2630-
React-performancetimeline: 0ee0a3236c77a4ee6d8a6189089e41e4003d292e
2629+
React-perflogger: ccf4fd2664b00818645e588623c7531a8b32d114
2630+
React-performancetimeline: a866ba759d8e06e9ba174b4421677edcae487baf
26312631
React-RCTActionSheet: 3f741a3712653611a6bfc5abceb8260af9d0b218
2632-
React-RCTAnimation: 408ad69ea136e99a463dd33eadecc29e586b3d72
2633-
React-RCTAppDelegate: f03b46e80b8a3dbfa84b35abfe123e02f3ceef83
2634-
React-RCTBlob: bd42e92a00ad22eaab92ffe5c137e7a2f725887a
2635-
React-RCTFabric: b99ab638c73cf2d57b886eafdbfb2e4909b0eb9a
2636-
React-RCTFBReactNativeSpec: 7ad9aba0e0655e3f29be0a1c3fd4a888fab04dcf
2637-
React-RCTImage: 0f1c74f7cd20027f8c34976a211b35d4263a0add
2638-
React-RCTLinking: 6d7dfc3a74110df56c3a73cc7626bf4415656542
2639-
React-RCTNetwork: 6a25d8645a80d5b86098675ca39bf8fcf1afa08b
2640-
React-RCTRuntime: 38bfe9766565ae3293ca230bc51c9c020a8bc98a
2641-
React-RCTSettings: 651d9ae2cdd32f547ad0d225a2c13886d6ad2358
2642-
React-RCTText: 9bc66cd288478e23195e01f5cb45eba79986b2b4
2643-
React-RCTVibration: 371226f5667a00c76d792dcdb5c2e0fcbcde0c3b
2632+
React-RCTAnimation: 2edeebfba175cc2e937e2752209ab605d3c48f21
2633+
React-RCTAppDelegate: e292321e83ee966897244a032216a70930b758d6
2634+
React-RCTBlob: 8dfb24b6dd4a5af45e1e59e2fd925b2df1e44d08
2635+
React-RCTFabric: b25b02a2016f5cb15926a60c77a8d75865aa3558
2636+
React-RCTFBReactNativeSpec: 20338571a1ed853d01da6c68576aa6e8e107b6f6
2637+
React-RCTImage: c7fe8c2f2ae8bad98ab4d944d5d50a889da4b652
2638+
React-RCTLinking: 9ac21ce9f1af914bb01c06af3752db2ec840d0ee
2639+
React-RCTNetwork: 09a5de71d757dbad4b3fe3615839290200b932aa
2640+
React-RCTRuntime: da3f1e0ce088c20350044cdf1efcd7f8d9b9b40c
2641+
React-RCTSettings: fee112652ac7569ea9abe910206e1685f5f9adba
2642+
React-RCTText: 7ee9d0bc16b3a8149f8df6d70c48e724d0db1d89
2643+
React-RCTVibration: 619d613abaeb05f6fbc2b2e5e33f724f05df8eb8
26442644
React-rendererconsistency: a05f6c37f9389c53213d1e28798e441fa6fbdbcd
2645-
React-renderercss: 6e4febfa014b0f53bc171a62b0f713ddbdbb9860
2646-
React-rendererdebug: e94bf27b9d55ef2795caa8e43aa92abc4a373b8b
2647-
React-RuntimeApple: 723be5159519eba1cd92449acb29436d21571b82
2648-
React-RuntimeCore: f58eb0f01065c9d27d91de10b2e4ab4c76d83b0e
2649-
React-runtimeexecutor: f615ec8742d0b5820170f7c8b4d2c7cb75d93ac9
2650-
React-RuntimeHermes: fddb258e03d330d1132bb19e78fe51ac2f3f41ac
2651-
React-runtimescheduler: e92a31460e654ced8587debeec37553315e1b6a5
2652-
React-timing: 97ada2c47b4c5932e7f773c7d239c52b90d6ca68
2653-
React-utils: f0949d247a46b4c09f03e5a3cb1167602d0b729a
2654-
ReactAppDependencyProvider: 3eb9096cb139eb433965693bbe541d96eb3d3ec9
2655-
ReactCodegen: 4d203eddf6f977caa324640a20f92e70408d648b
2656-
ReactCommon: ce5d4226dfaf9d5dacbef57b4528819e39d3a120
2645+
React-renderercss: 3decb27a81648fcdee837c59994b51fff5be5a67
2646+
React-rendererdebug: 3b9a92d36932af52e1b473f2a89ea4b05dbdecdf
2647+
React-RuntimeApple: 4e35fb74be4b721c2e1fd6d54ec66456fa7043e9
2648+
React-RuntimeCore: 0fd7ac6e3e9dd20cb47e87c6b9f35832dd445d5e
2649+
React-runtimeexecutor: 7680156c9f3a5a49c688bc33f9ec5ea1b00527f5
2650+
React-RuntimeHermes: 435b7104a3c749af6251353dcb7317a8e53cbd73
2651+
React-runtimescheduler: 8056b916168e446ea44531883928034e62e76a81
2652+
React-timing: 36da85e32e53008ce73f87528818191e7f2508ba
2653+
React-utils: 71e53d55ce778c6e7c7c9db4b1b9d63ef8f55289
2654+
ReactAppDependencyProvider: 448b422f8af1dedf81374eacc90a15439a0ed7f5
2655+
ReactCodegen: 3baedb0c33f963250c866151b825a3c5194b12f1
2656+
ReactCommon: e897f9a1b4afab370cfefaaf5fb3c80371bc3937
26572657
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
2658-
Yoga: 11c9686a21e2cd82a094a723649d9f4507200fb0
2658+
Yoga: fa23995c18b65978347b096d0836f4f5093df545
26592659

26602660
PODFILE CHECKSUM: caa3b1c0eb720af4b5b95ccf1991b4f988d100f0
26612661

2662-
COCOAPODS: 1.16.2
2662+
COCOAPODS: 1.15.2

src/components/Prompt/Button.tsx

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,30 @@ interface Props {
1818
survey?: Survey;
1919
}
2020

21+
const calculateLuminance = (hexColor: string): number => {
22+
// Remove # if present
23+
const hex = hexColor.replace('#', '');
24+
25+
// Convert hex to RGB (0-255)
26+
const r = parseInt(hex.substring(0, 2), 16);
27+
const g = parseInt(hex.substring(2, 4), 16);
28+
const b = parseInt(hex.substring(4, 6), 16);
29+
30+
// Linearize sRGB values (gamma correction) per WCAG spec
31+
const linearize = (channel: number): number => {
32+
const c = channel / 255;
33+
return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
34+
};
35+
36+
const rLinear = linearize(r);
37+
const gLinear = linearize(g);
38+
const bLinear = linearize(b);
39+
40+
// Calculate relative luminance using WCAG formula
41+
// https://www.w3.org/TR/WCAG20/#relativeluminancedef
42+
return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear;
43+
};
44+
2145
const PromptButton: (Props: Props) => React.ReactElement = ({
2246
color,
2347
colorDark,
@@ -26,23 +50,24 @@ const PromptButton: (Props: Props) => React.ReactElement = ({
2650
survey,
2751
}) => {
2852
let backgroundColor;
29-
let textColor;
3053

3154
switch (survey?.appearance) {
3255
case Themes.Dark:
3356
backgroundColor = colorDark || color;
34-
textColor = Colors.Black;
3557
break;
3658
case Themes.Light:
3759
backgroundColor = color;
38-
textColor = Colors.White;
3960
break;
4061
default:
41-
Appearance.getColorScheme() === Themes.Dark
42-
? ((backgroundColor = colorDark || color), (textColor = Colors.Black))
43-
: ((backgroundColor = color), (textColor = Colors.White));
62+
backgroundColor =
63+
Appearance.getColorScheme() === Themes.Dark
64+
? colorDark || color
65+
: color;
4466
}
4567

68+
const luminance = calculateLuminance(backgroundColor);
69+
const textColor = luminance < 0.5 ? Colors.White : Colors.Black;
70+
4671
return (
4772
<View>
4873
<TouchableHighlight

0 commit comments

Comments
 (0)