Skip to content

Commit bb15d1f

Browse files
authored
feat: improve liquid glass detection (#3)
1 parent fc00f41 commit bb15d1f

File tree

10 files changed

+109
-9
lines changed

10 files changed

+109
-9
lines changed

README.md

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,17 @@ yarn add @callstack/liquid-glass
3131
### Usage
3232

3333
```tsx
34-
import { LiquidGlassView } from '@callstack/liquid-glass';
35-
36-
// Handle fallback for unsupported iOS versions
37-
const supportsLiquidGlass =
38-
Platform.OS === 'ios' && Number(Platform.Version.split('.').at(0)) >= 26;
34+
import {
35+
LiquidGlassView,
36+
isLiquidGlassSupported,
37+
} from '@callstack/liquid-glass';
3938

4039
function MyComponent() {
4140
return (
4241
<LiquidGlassView
4342
style={[
4443
{ width: 200, height: 100, borderRadius: 20 },
45-
!supportsLiquidGlass && { backgroundColor: 'rgba(255,255,255,0.5)' },
44+
!isLiquidGlassSupported && { backgroundColor: 'rgba(255,255,255,0.5)' },
4645
]}
4746
interactive
4847
effect="clear"
@@ -56,6 +55,22 @@ function MyComponent() {
5655
> [!NOTE]
5756
> On unsupported iOS version (below iOS 26), it will render a normal `View` without any effects.
5857
58+
### API
59+
60+
#### `isLiquidGlassSupported`
61+
62+
A boolean constant that indicates whether the current device supports the liquid glass effect.
63+
64+
```tsx
65+
import { isLiquidGlassSupported } from '@callstack/liquid-glass';
66+
67+
if (isLiquidGlassSupported) {
68+
// Device supports liquid glass effect
69+
} else {
70+
// Provide fallback UI
71+
}
72+
```
73+
5974
### LiquidGlassView - Props
6075

6176
| Prop | Type | Default | Description |

example/src/App.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import {
99
View,
1010
Pressable,
1111
} from 'react-native';
12-
import { LiquidGlassView } from '@callstack/liquid-glass';
12+
import {
13+
LiquidGlassView,
14+
isLiquidGlassSupported,
15+
} from '@callstack/liquid-glass';
1316
import { useEffect, useState } from 'react';
1417

1518
const AnimatedLiquidGlassView =
@@ -62,7 +65,10 @@ function WeatherWidget() {
6265
return (
6366
<View style={{ flexDirection: 'row', gap: 10, marginBottom: 20 }}>
6467
<LiquidGlassView
65-
style={styles.weather}
68+
style={[
69+
styles.weather,
70+
!isLiquidGlassSupported && { backgroundColor: 'rgba(255,165,0,0.3)' },
71+
]}
6672
interactive={true}
6773
effect={'clear'}
6874
tintColor={'orange'}

ios/LiquidGlassContainerView.mm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77

88
#import "RCTFabricComponentsPlugins.h"
99

10+
#if __has_include("LiquidGlass/LiquidGlass-Swift.h")
11+
#import "LiquidGlass/LiquidGlass-Swift.h"
12+
#else
1013
#import "LiquidGlass-Swift.h"
14+
#endif
1115

1216
using namespace facebook::react;
1317

ios/LiquidGlassModule.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#import <UIKit/UIKit.h>
2+
3+
#import <React/RCTBridge.h>
4+
#import <LiquidGlassViewSpec/LiquidGlassViewSpec.h>
5+
6+
@interface LiquidGlassModule : NSObject <NativeLiquidGlassModuleSpec>
7+
8+
@end
9+

ios/LiquidGlassModule.mm

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#import "LiquidGlassModule.h"
2+
3+
@implementation LiquidGlassModule {
4+
facebook::react::ModuleConstants<JS::NativeLiquidGlassModule::Constants> _constants;
5+
}
6+
7+
- (void)initialize
8+
{
9+
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 260000 /* __IPHONE_26_0 */
10+
if (@available(iOS 26.0, *)) {
11+
_constants = facebook::react::typedConstants<JS::NativeLiquidGlassModule::Constants>({
12+
.isLiquidGlassSupported = YES
13+
});
14+
}
15+
#else
16+
_constants = facebook::react::typedConstants<JS::NativeLiquidGlassModule::Constants>({
17+
.isLiquidGlassSupported = NO
18+
});
19+
#endif
20+
}
21+
22+
- (facebook::react::ModuleConstants<JS::NativeLiquidGlassModule::Constants>)constantsToExport
23+
{
24+
return (facebook::react::ModuleConstants<JS::NativeLiquidGlassModule::Constants>)[self getConstants];
25+
}
26+
27+
+ (NSString *)moduleName {
28+
return @"NativeLiquidGlassModule";
29+
}
30+
31+
32+
- (facebook::react::ModuleConstants<JS::NativeLiquidGlassModule::Constants>)getConstants
33+
{
34+
return _constants;
35+
}
36+
37+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
38+
return std::make_shared<facebook::react::NativeLiquidGlassModuleSpecJSI>(params);
39+
}
40+
41+
@end

ios/LiquidGlassView.mm

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@
77
#import "RCTImagePrimitivesConversions.h"
88

99
#import "RCTFabricComponentsPlugins.h"
10+
#import "RCTConversions.h"
1011

12+
#if __has_include("LiquidGlass/LiquidGlass-Swift.h")
13+
#import "LiquidGlass/LiquidGlass-Swift.h"
14+
#else
1115
#import "LiquidGlass-Swift.h"
12-
#import "RCTConversions.h"
16+
#endif
1317

1418
using namespace facebook::react;
1519

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@
159159
"componentProvider": {
160160
"LiquidGlassView": "LiquidGlassView",
161161
"LiquidGlassContainerView": "LiquidGlassContainerView"
162+
},
163+
"modulesProvider": {
164+
"NativeLiquidGlassModule": "LiquidGlassModule"
162165
}
163166
}
164167
},

src/NativeLiquidGlassModule.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { TurboModuleRegistry, type TurboModule } from 'react-native';
2+
3+
type LiquidGlassModuleConstants = {
4+
isLiquidGlassSupported: boolean;
5+
};
6+
7+
export interface Spec extends TurboModule {
8+
getConstants(): LiquidGlassModuleConstants;
9+
}
10+
11+
export default TurboModuleRegistry.getEnforcing<Spec>(
12+
'NativeLiquidGlassModule'
13+
);

src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { LiquidGlassView } from './LiquidGlassView';
22
export { type NativeProps as LiquidGlassViewProps } from './LiquidGlassViewNativeComponent';
3+
export { isLiquidGlassSupported } from './isLiquidGlassSupported';

src/isLiquidGlassSupported.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import NativeLiquidGlassModule from './NativeLiquidGlassModule';
2+
3+
export const isLiquidGlassSupported =
4+
NativeLiquidGlassModule.getConstants().isLiquidGlassSupported;

0 commit comments

Comments
 (0)