Skip to content

Commit 5c1b5cf

Browse files
gksandernecolas
authored andcommitted
[fix] Appearance API update
Match react-native >=0.65 Fix necolas#2329
1 parent e027829 commit 5c1b5cf

File tree

3 files changed

+13
-9
lines changed

3 files changed

+13
-9
lines changed

packages/react-native-web-docs/src/pages/docs/apis/appearance.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ eleventyNavigation:
1010
{% import "fragments/macros.html" as macro with context %}
1111

1212
:::lead
13-
The Appearance module exposes information about the user's appearance preferences, such as their preferred color scheme (light or dark).
13+
The Appearance module exposes information about the user's appearance preferences, such as their preferred color scheme (light or dark).
1414
:::
1515

1616
```js
@@ -23,6 +23,10 @@ import { Appearance } from 'react-native';
2323

2424
### Static methods
2525

26+
{% call macro.prop('addChangeListener', '(listener) => { remove: () => void }') %}
27+
Add an event handler that is called with `{colorScheme: "dark" | "light"}` when appearance preferences change. Returns a `remove` method used to remove the change listener.
28+
{% endcall %}
29+
2630
{% call macro.prop('getColorScheme', '() => ("dark" | "light")') %}
2731
You can use the Appearance module to determine if the user prefers a dark color scheme. Although the color scheme is available immediately, this may change (e.g. scheduled color scheme change at sunrise or sunset). Any rendering logic or styles that depend on the user preferred color scheme should try to call this function on every render, rather than caching the value.
2832
{% endcall %}

packages/react-native-web/src/exports/Appearance/index.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const Appearance = {
3737
return query && query.matches ? 'dark' : 'light';
3838
},
3939

40-
addChangeListener(listener: AppearanceListener): void {
40+
addChangeListener(listener: AppearanceListener): { remove: () => void } {
4141
let mappedListener = listenerMapping.get(listener);
4242
if (!mappedListener) {
4343
mappedListener = ({ matches }: MediaQueryListEvent) => {
@@ -48,16 +48,16 @@ const Appearance = {
4848
if (query) {
4949
query.addListener(mappedListener);
5050
}
51-
},
5251

53-
removeChangeListener(listener: AppearanceListener): void {
54-
const mappedListener = listenerMapping.get(listener);
55-
if (mappedListener) {
56-
if (query) {
52+
function remove(): void {
53+
const mappedListener = listenerMapping.get(listener);
54+
if (query && mappedListener) {
5755
query.removeListener(mappedListener);
5856
}
5957
listenerMapping.delete(listener);
6058
}
59+
60+
return { remove };
6161
}
6262
};
6363

packages/react-native-web/src/exports/useColorScheme/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ export default function useColorScheme(): ColorSchemeName {
2121
function listener(appearance) {
2222
setColorScheme(appearance.colorScheme);
2323
}
24-
Appearance.addChangeListener(listener);
25-
return () => Appearance.removeChangeListener(listener);
24+
const { remove } = Appearance.addChangeListener(listener);
25+
return remove;
2626
});
2727

2828
return colorScheme;

0 commit comments

Comments
 (0)