react-native-unistyles 2.0.0-alpha.2 → 2.0.0-alpha.4
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/ios/UnistylesHelpers.h +4 -0
- package/ios/UnistylesHelpers.mm +20 -0
- package/ios/UnistylesModule.h +2 -2
- package/ios/UnistylesModule.mm +83 -38
- package/lib/commonjs/UnistyleRegistry.js +15 -7
- package/lib/commonjs/UnistyleRegistry.js.map +1 -1
- package/lib/commonjs/UnistylesRuntime.js +29 -15
- package/lib/commonjs/UnistylesRuntime.js.map +1 -1
- package/lib/commonjs/hooks/useDimensions.web.js +7 -5
- package/lib/commonjs/hooks/useDimensions.web.js.map +1 -1
- package/lib/commonjs/index.js +4 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types/cxx.js +9 -5
- package/lib/commonjs/types/cxx.js.map +1 -1
- package/lib/commonjs/useInitialTheme.js +1 -1
- package/lib/commonjs/useInitialTheme.js.map +1 -1
- package/lib/commonjs/useUnistyles.js +5 -7
- package/lib/commonjs/useUnistyles.js.map +1 -1
- package/lib/commonjs/utils/breakpoints.js.map +1 -1
- package/lib/module/UnistyleRegistry.js +15 -7
- package/lib/module/UnistyleRegistry.js.map +1 -1
- package/lib/module/UnistylesRuntime.js +30 -16
- package/lib/module/UnistylesRuntime.js.map +1 -1
- package/lib/module/hooks/useDimensions.web.js +8 -6
- package/lib/module/hooks/useDimensions.web.js.map +1 -1
- package/lib/module/index.js +3 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/types/cxx.js +8 -4
- package/lib/module/types/cxx.js.map +1 -1
- package/lib/module/useInitialTheme.js +2 -2
- package/lib/module/useInitialTheme.js.map +1 -1
- package/lib/module/useUnistyles.js +5 -7
- package/lib/module/useUnistyles.js.map +1 -1
- package/lib/module/utils/breakpoints.js.map +1 -1
- package/lib/typescript/src/UnistyleRegistry.d.ts +3 -2
- package/lib/typescript/src/UnistyleRegistry.d.ts.map +1 -1
- package/lib/typescript/src/UnistylesRuntime.d.ts +14 -46
- package/lib/typescript/src/UnistylesRuntime.d.ts.map +1 -1
- package/lib/typescript/src/global.d.ts +1 -0
- package/lib/typescript/src/global.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useDimensions.web.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +3 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types/cxx.d.ts +21 -13
- package/lib/typescript/src/types/cxx.d.ts.map +1 -1
- package/lib/typescript/src/useStyles.d.ts +3 -39
- package/lib/typescript/src/useStyles.d.ts.map +1 -1
- package/lib/typescript/src/useUnistyles.d.ts +2 -38
- package/lib/typescript/src/useUnistyles.d.ts.map +1 -1
- package/package.json +12 -13
- package/react-native-unistyles.podspec +2 -1
- package/src/UnistyleRegistry.ts +19 -8
- package/src/UnistylesRuntime.ts +31 -16
- package/src/global.ts +3 -1
- package/src/hooks/useDimensions.web.ts +9 -6
- package/src/index.ts +4 -2
- package/src/types/cxx.ts +25 -14
- package/src/useInitialTheme.ts +2 -2
- package/src/useUnistyles.ts +5 -6
- package/src/utils/breakpoints.ts +1 -1
- package/ios/UnistylesRuntime.h +0 -30
- package/ios/UnistylesRuntime.mm +0 -191
- package/lib/typescript/examples/expo/src/App.d.ts +0 -3
- package/lib/typescript/examples/expo/src/App.d.ts.map +0 -1
- package/lib/typescript/examples/expo/src/examples/Cxx.d.ts +0 -3
- package/lib/typescript/examples/expo/src/examples/Cxx.d.ts.map +0 -1
- package/lib/typescript/examples/expo/src/examples/index.d.ts +0 -2
- package/lib/typescript/examples/expo/src/examples/index.d.ts.map +0 -1
- package/lib/typescript/examples/expo/src/index.d.ts +0 -2
- package/lib/typescript/examples/expo/src/index.d.ts.map +0 -1
- package/lib/typescript/examples/expo/src/styles/breakpoints.d.ts +0 -8
- package/lib/typescript/examples/expo/src/styles/breakpoints.d.ts.map +0 -1
- package/lib/typescript/examples/expo/src/styles/index.d.ts +0 -16
- package/lib/typescript/examples/expo/src/styles/index.d.ts.map +0 -1
- package/lib/typescript/examples/expo/src/styles/theme.d.ts +0 -40
- package/lib/typescript/examples/expo/src/styles/theme.d.ts.map +0 -1
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "react-native-unistyles",
|
3
|
-
"version": "2.0.0-alpha.
|
3
|
+
"version": "2.0.0-alpha.4",
|
4
4
|
"description": "Level up your React Native StyleSheet",
|
5
5
|
"scripts": {
|
6
6
|
"test": "jest",
|
@@ -41,25 +41,24 @@
|
|
41
41
|
"registry": "https://registry.npmjs.org/"
|
42
42
|
},
|
43
43
|
"devDependencies": {
|
44
|
-
"@commitlint/config-conventional": "
|
44
|
+
"@commitlint/config-conventional": "18.1.0",
|
45
45
|
"@react-native/eslint-config": "0.74.0",
|
46
46
|
"@react-native/normalize-colors": "0.74.1",
|
47
47
|
"@release-it/conventional-changelog": "7.0.2",
|
48
48
|
"@testing-library/react-hooks": "8.0.1",
|
49
|
-
"@types/jest": "29.5.
|
50
|
-
"@types/react": "18.2.
|
51
|
-
"@
|
52
|
-
"@typescript-eslint/eslint-plugin": "6.
|
53
|
-
"@typescript-eslint/
|
54
|
-
"
|
55
|
-
"
|
56
|
-
"
|
57
|
-
"eslint": "8.51.0",
|
49
|
+
"@types/jest": "29.5.7",
|
50
|
+
"@types/react": "18.2.34",
|
51
|
+
"@typescript-eslint/eslint-plugin": "6.9.1",
|
52
|
+
"@typescript-eslint/eslint-plugin-tslint": "6.9.1",
|
53
|
+
"@typescript-eslint/parser": "6.9.1",
|
54
|
+
"commitlint": "18.2.0",
|
55
|
+
"concurrently": "8.2.2",
|
56
|
+
"eslint": "8.53.0",
|
58
57
|
"eslint-config-codemask": "1.1.7",
|
59
58
|
"eslint-plugin-functional": "6.0.0",
|
60
|
-
"eslint-plugin-import": "2.
|
59
|
+
"eslint-plugin-import": "2.29.0",
|
61
60
|
"eslint-plugin-jsdoc": "46.8.2",
|
62
|
-
"eslint-plugin-jsx-a11y": "6.
|
61
|
+
"eslint-plugin-jsx-a11y": "6.8.0",
|
63
62
|
"eslint-plugin-nested-if": "1.0.0",
|
64
63
|
"eslint-plugin-no-else": "0.2.2",
|
65
64
|
"eslint-plugin-no-loops": "0.3.0",
|
package/src/UnistyleRegistry.ts
CHANGED
@@ -2,17 +2,22 @@ import type { UnistylesBridge, UnistylesConfig } from './types'
|
|
2
2
|
import type { UnistylesThemes, UnistylesBreakpoints } from './global'
|
3
3
|
|
4
4
|
export class UnistyleRegistry {
|
5
|
-
public
|
5
|
+
public config: UnistylesConfig = {}
|
6
|
+
public themeNames: Array<keyof UnistylesThemes> = []
|
6
7
|
public themes: UnistylesThemes = {} as UnistylesThemes
|
7
8
|
public breakpoints: UnistylesBreakpoints = {} as UnistylesBreakpoints
|
8
9
|
public sortedBreakpointPairs: Array<[keyof UnistylesBreakpoints, UnistylesBreakpoints[keyof UnistylesBreakpoints]]> = []
|
9
|
-
public config: UnistylesConfig = {}
|
10
10
|
|
11
11
|
constructor(private unistylesBridge: UnistylesBridge) {}
|
12
12
|
|
13
13
|
public addThemes = (themes: UnistylesThemes) => {
|
14
14
|
this.themes = themes
|
15
15
|
|
16
|
+
const keys = Object.keys(themes) as Array<keyof UnistylesThemes>
|
17
|
+
|
18
|
+
this.unistylesBridge.themes = keys
|
19
|
+
this.themeNames = keys
|
20
|
+
|
16
21
|
return this
|
17
22
|
}
|
18
23
|
|
@@ -26,14 +31,20 @@ export class UnistyleRegistry {
|
|
26
31
|
public addConfig = (config: UnistylesConfig) => {
|
27
32
|
this.config = config
|
28
33
|
|
29
|
-
if (config.
|
30
|
-
this.unistylesBridge.
|
31
|
-
}
|
32
|
-
|
33
|
-
if (config.colorScheme) {
|
34
|
-
this.unistylesBridge.useColorScheme(config.colorScheme)
|
34
|
+
if (config.adaptiveThemes) {
|
35
|
+
this.unistylesBridge.useAdaptiveThemes(config.adaptiveThemes)
|
35
36
|
}
|
36
37
|
|
37
38
|
return this
|
38
39
|
}
|
40
|
+
|
41
|
+
public dangerouslyUnregister = () => {
|
42
|
+
this.config = {}
|
43
|
+
this.themeNames = []
|
44
|
+
this.themes = {} as UnistylesThemes
|
45
|
+
this.breakpoints = {} as UnistylesBreakpoints
|
46
|
+
this.sortedBreakpointPairs = []
|
47
|
+
|
48
|
+
this.unistylesBridge.unregister()
|
49
|
+
}
|
39
50
|
}
|
package/src/UnistylesRuntime.ts
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import type { UnistylesBridge } from './types'
|
2
2
|
import type { UnistyleRegistry } from './UnistyleRegistry'
|
3
|
-
import {
|
3
|
+
import { ScreenOrientation, UnistylesError } from './types'
|
4
4
|
import type { UnistylesThemes } from './global'
|
5
5
|
|
6
6
|
export class UnistylesRuntime {
|
@@ -10,49 +10,64 @@ export class UnistylesRuntime {
|
|
10
10
|
return this.unistylesBridge.colorScheme
|
11
11
|
}
|
12
12
|
|
13
|
-
public get
|
14
|
-
return this.
|
13
|
+
public get hasAdaptiveThemes() {
|
14
|
+
return this.unistylesBridge.hasAdaptiveThemes
|
15
15
|
}
|
16
16
|
|
17
17
|
public get sortedBreakpoints() {
|
18
18
|
return this.registry.sortedBreakpointPairs
|
19
19
|
}
|
20
20
|
|
21
|
-
public get
|
22
|
-
return this.
|
21
|
+
public get themeName() {
|
22
|
+
return this.unistylesBridge.themeName
|
23
23
|
}
|
24
24
|
|
25
|
-
public get
|
26
|
-
return this.unistylesBridge.
|
25
|
+
public get breakpoint() {
|
26
|
+
return this.unistylesBridge.breakpoint
|
27
27
|
}
|
28
28
|
|
29
|
-
public get
|
30
|
-
return
|
29
|
+
public get screen() {
|
30
|
+
return {
|
31
|
+
width: this.unistylesBridge.screenWidth,
|
32
|
+
height: this.unistylesBridge.screenHeight
|
33
|
+
}
|
31
34
|
}
|
32
35
|
|
33
|
-
public
|
34
|
-
|
35
|
-
|
36
|
+
public get orientation() {
|
37
|
+
const { width, height } = this.screen
|
38
|
+
|
39
|
+
if (width > height) {
|
40
|
+
return ScreenOrientation.Landscape
|
36
41
|
}
|
42
|
+
|
43
|
+
return ScreenOrientation.Portrait
|
37
44
|
}
|
38
45
|
|
39
46
|
public setTheme = (name: keyof UnistylesThemes) => {
|
40
|
-
if (name !== this.
|
47
|
+
if (name !== this.themeName && this.hasTheme(name)) {
|
41
48
|
this.unistylesBridge.useTheme(name)
|
42
49
|
|
43
50
|
return true
|
44
51
|
}
|
45
52
|
|
46
|
-
|
53
|
+
throw new Error(UnistylesError.ThemeNotRegistered)
|
47
54
|
}
|
48
55
|
|
49
|
-
public hasTheme = (name: keyof UnistylesThemes) => name in this.registry.themes
|
50
|
-
|
51
56
|
public getTheme = (forName: keyof UnistylesThemes) => {
|
57
|
+
if (this.registry.themeNames.length === 0) {
|
58
|
+
return {} as UnistylesThemes[keyof UnistylesThemes]
|
59
|
+
}
|
60
|
+
|
52
61
|
if (!this.hasTheme(forName)) {
|
53
62
|
throw new Error(UnistylesError.ThemeNotFound)
|
54
63
|
}
|
55
64
|
|
56
65
|
return this.registry.themes[forName]
|
57
66
|
}
|
67
|
+
|
68
|
+
public setAdaptiveThemes = (enable: boolean) => {
|
69
|
+
this.unistylesBridge.useAdaptiveThemes(enable)
|
70
|
+
}
|
71
|
+
|
72
|
+
private hasTheme = (name: keyof UnistylesThemes) => name in this.registry.themes
|
58
73
|
}
|
package/src/global.ts
CHANGED
@@ -1,13 +1,16 @@
|
|
1
|
-
import { useEffect, useRef, useState } from 'react'
|
1
|
+
import { useEffect, useLayoutEffect, useRef, useState } from 'react'
|
2
2
|
import type { ScreenSize } from '../types'
|
3
|
-
import { isServer } from '../utils'
|
4
3
|
|
5
4
|
export const useDimensions = (): ScreenSize => {
|
6
5
|
const timerRef = useRef<ReturnType<typeof setTimeout>>()
|
7
|
-
const [screenSize, setScreenSize] = useState<ScreenSize>({
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
const [screenSize, setScreenSize] = useState<ScreenSize>({} as ScreenSize)
|
7
|
+
|
8
|
+
useLayoutEffect(() => {
|
9
|
+
setScreenSize({
|
10
|
+
width: window.innerWidth,
|
11
|
+
height: window.innerHeight
|
12
|
+
})
|
13
|
+
}, [])
|
11
14
|
|
12
15
|
useEffect(() => {
|
13
16
|
const handleResize = () => {
|
package/src/index.ts
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import { unistyles } from './Unistyles'
|
2
2
|
import type { UnistylesThemes, UnistylesBreakpoints } from './global'
|
3
|
-
import {
|
3
|
+
import { ScreenOrientation } from './types'
|
4
4
|
|
5
5
|
export { useInitialTheme } from './useInitialTheme'
|
6
6
|
|
@@ -15,13 +15,15 @@ const UnistylesRegistry = {
|
|
15
15
|
addConfig
|
16
16
|
}
|
17
17
|
|
18
|
+
export const __dangerouslyUnregister = unistyles.registry.dangerouslyUnregister
|
19
|
+
|
18
20
|
export {
|
19
21
|
UnistylesRuntime,
|
20
22
|
UnistylesRegistry
|
21
23
|
}
|
22
24
|
|
23
25
|
export {
|
24
|
-
|
26
|
+
ScreenOrientation
|
25
27
|
}
|
26
28
|
|
27
29
|
export type {
|
package/src/types/cxx.ts
CHANGED
@@ -1,28 +1,35 @@
|
|
1
1
|
import type { UnistylesThemes, UnistylesBreakpoints } from '../global'
|
2
2
|
|
3
3
|
export type Nullable<T> = T | null
|
4
|
-
export
|
5
|
-
System = 'system',
|
6
|
-
Manual = 'manual'
|
7
|
-
}
|
4
|
+
export type ColorSchemeName = 'light' | 'dark' | undefined
|
8
5
|
|
9
6
|
export type UnistylesConfig = {
|
10
|
-
|
11
|
-
|
7
|
+
adaptiveThemes?: boolean
|
8
|
+
}
|
9
|
+
|
10
|
+
export enum ScreenOrientation {
|
11
|
+
Portrait = 1,
|
12
|
+
Landscape = 2
|
12
13
|
}
|
13
14
|
|
14
15
|
export type UnistylesBridge = {
|
15
16
|
// getters
|
16
|
-
|
17
|
+
screenWidth: number,
|
18
|
+
screenHeight: number,
|
19
|
+
hasAdaptiveThemes: boolean,
|
20
|
+
themeName: keyof UnistylesThemes,
|
17
21
|
breakpoint: keyof UnistylesBreakpoints,
|
18
|
-
colorScheme:
|
19
|
-
sortedBreakpointPairs: Array<[keyof UnistylesBreakpoints, UnistylesBreakpoints[keyof UnistylesBreakpoints]]
|
22
|
+
colorScheme: ColorSchemeName,
|
23
|
+
sortedBreakpointPairs: Array<[keyof UnistylesBreakpoints, UnistylesBreakpoints[keyof UnistylesBreakpoints]]>,
|
20
24
|
|
21
25
|
// setters
|
26
|
+
themes: Array<keyof UnistylesThemes>,
|
22
27
|
useBreakpoints(breakpoints: UnistylesBreakpoints): void,
|
23
28
|
useTheme(name: keyof UnistylesThemes): void,
|
24
|
-
|
25
|
-
|
29
|
+
useAdaptiveThemes(enable: boolean): void,
|
30
|
+
|
31
|
+
// other
|
32
|
+
unregister(): void
|
26
33
|
}
|
27
34
|
|
28
35
|
export enum CxxUnistylesEventTypes {
|
@@ -34,7 +41,7 @@ export enum CxxUnistylesEventTypes {
|
|
34
41
|
export type CxxUnistylesThemeEvent = {
|
35
42
|
type: CxxUnistylesEventTypes.Theme,
|
36
43
|
payload: {
|
37
|
-
|
44
|
+
themeName: keyof UnistylesThemes
|
38
45
|
}
|
39
46
|
}
|
40
47
|
|
@@ -49,7 +56,7 @@ export type CxxUnistylesSizeEvent = {
|
|
49
56
|
export type CxxUnistylesBreakpointEvent = {
|
50
57
|
type: CxxUnistylesEventTypes.Breakpoint,
|
51
58
|
payload: {
|
52
|
-
|
59
|
+
breakpoint: keyof UnistylesBreakpoints
|
53
60
|
}
|
54
61
|
}
|
55
62
|
|
@@ -57,5 +64,9 @@ export type UnistylesEvents = CxxUnistylesThemeEvent | CxxUnistylesSizeEvent | C
|
|
57
64
|
|
58
65
|
export enum UnistylesError {
|
59
66
|
RuntimeUnavailable = 'UNISTYLES_ERROR_RUNTIME_UNAVAILABLE',
|
60
|
-
ThemeNotFound = 'UNISTYLES_ERROR_THEME_NOT_FOUND'
|
67
|
+
ThemeNotFound = 'UNISTYLES_ERROR_THEME_NOT_FOUND',
|
68
|
+
ThemeNotRegistered = 'UNISTYLES_ERROR_THEME_NOT_REGISTERED',
|
69
|
+
ThemesCannotBeEmpty = 'UNISTYLES_ERROR_THEMES_CANNOT_BE_EMPTY',
|
70
|
+
BreakpointsCannotBeEmpty = 'UNISTYLES_ERROR_BREAKPOINTS_CANNOT_BE_EMPTY',
|
71
|
+
BreakpointsMustStartFromZero = 'UNISTYLES_ERROR_BREAKPOINTS_MUST_START_FROM_ZERO',
|
61
72
|
}
|
package/src/useInitialTheme.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
import {
|
1
|
+
import { useMemo } from 'react'
|
2
2
|
import { unistyles } from './Unistyles'
|
3
3
|
import type { UnistylesThemes } from './global'
|
4
4
|
|
5
5
|
export const useInitialTheme = (forName: keyof UnistylesThemes) => {
|
6
|
-
|
6
|
+
useMemo(() => unistyles.runtime.setTheme(forName), [])
|
7
7
|
}
|
package/src/useUnistyles.ts
CHANGED
@@ -12,8 +12,8 @@ import { unistyles } from './Unistyles'
|
|
12
12
|
const unistylesEvents = new NativeEventEmitter(NativeModules.Unistyles)
|
13
13
|
|
14
14
|
export const useUnistyles = () => {
|
15
|
-
const [theme, setTheme] = useState(unistyles.runtime.getTheme(unistyles.runtime.
|
16
|
-
const [breakpoint, setBreakpoint] = useState(unistyles.runtime.
|
15
|
+
const [theme, setTheme] = useState(unistyles.runtime.getTheme(unistyles.runtime.themeName))
|
16
|
+
const [breakpoint, setBreakpoint] = useState(unistyles.runtime.breakpoint)
|
17
17
|
const [screenSize, setScreenSize] = useState({
|
18
18
|
width: 0,
|
19
19
|
height: 0
|
@@ -27,10 +27,11 @@ export const useUnistyles = () => {
|
|
27
27
|
case CxxUnistylesEventTypes.Theme: {
|
28
28
|
const themeEvent = event as CxxUnistylesThemeEvent
|
29
29
|
|
30
|
-
setTheme(unistyles.runtime.getTheme(themeEvent.payload.
|
30
|
+
setTheme(unistyles.runtime.getTheme(themeEvent.payload.themeName))
|
31
31
|
|
32
32
|
return
|
33
33
|
}
|
34
|
+
// this event is not available on mobile
|
34
35
|
case CxxUnistylesEventTypes.Size: {
|
35
36
|
const sizeEvent = event as CxxUnistylesSizeEvent
|
36
37
|
|
@@ -38,15 +39,13 @@ export const useUnistyles = () => {
|
|
38
39
|
width: sizeEvent.payload.width,
|
39
40
|
height: sizeEvent.payload.height
|
40
41
|
})
|
41
|
-
// todo
|
42
|
-
// setBreakpoint(unistyles.runtime.currentBreakpoint)
|
43
42
|
|
44
43
|
return
|
45
44
|
}
|
46
45
|
case CxxUnistylesEventTypes.Breakpoint: {
|
47
46
|
const breakpointEvent = event as CxxUnistylesBreakpointEvent
|
48
47
|
|
49
|
-
setBreakpoint(breakpointEvent.payload.
|
48
|
+
setBreakpoint(breakpointEvent.payload.breakpoint)
|
50
49
|
|
51
50
|
return
|
52
51
|
}
|
package/src/utils/breakpoints.ts
CHANGED
@@ -66,7 +66,7 @@ export const sortAndValidateBreakpoints = (breakpoints: UnistylesBreakpoints): U
|
|
66
66
|
export const getBreakpointFromScreenWidth = (width: number, breakpointEntries: Array<[keyof UnistylesBreakpoints, UnistylesBreakpoints[keyof UnistylesBreakpoints]]>): keyof UnistylesBreakpoints & string => {
|
67
67
|
const [key] = breakpointEntries
|
68
68
|
.find(([, value], index, otherBreakpoints) => {
|
69
|
-
const minVal = value
|
69
|
+
const minVal = value as number
|
70
70
|
const maxVal = otherBreakpoints[index + 1]?.[1]
|
71
71
|
|
72
72
|
if (!maxVal) {
|
package/ios/UnistylesRuntime.h
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
#pragma once
|
2
|
-
|
3
|
-
#import "UnistylesModule.h"
|
4
|
-
#import <jsi/jsi.h>
|
5
|
-
#import <vector>
|
6
|
-
|
7
|
-
using namespace facebook;
|
8
|
-
|
9
|
-
class JSI_EXPORT UnistylesRuntime : public jsi::HostObject {
|
10
|
-
private:
|
11
|
-
UnistylesEventHandler eventHandler;
|
12
|
-
float screenWidth;
|
13
|
-
float screenHeight;
|
14
|
-
|
15
|
-
public:
|
16
|
-
UnistylesRuntime(UnistylesEventHandler handler, CGFloat screenWidth, CGFloat screenHeight)
|
17
|
-
: eventHandler(handler), screenWidth(screenWidth), screenHeight(screenHeight) {}
|
18
|
-
|
19
|
-
std::string theme;
|
20
|
-
std::string breakpoint;
|
21
|
-
std::string colorScheme;
|
22
|
-
std::vector<std::string> featureFlags;
|
23
|
-
std::vector<std::pair<std::string, double>> sortedBreakpointEntries;
|
24
|
-
|
25
|
-
jsi::Value get(jsi::Runtime&, const jsi::PropNameID& name) override;
|
26
|
-
std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime& rt) override;
|
27
|
-
|
28
|
-
void handleScreenSizeChangeWithWidth(CGFloat width, CGFloat height);
|
29
|
-
std::string getBreakpointFromScreenWidth(double width, const std::vector<std::pair<std::string, double>>& sortedBreakpointEntries);
|
30
|
-
};
|
package/ios/UnistylesRuntime.mm
DELETED
@@ -1,191 +0,0 @@
|
|
1
|
-
#import "UnistylesRuntime.h"
|
2
|
-
|
3
|
-
std::vector<jsi::PropNameID> UnistylesRuntime::getPropertyNames(jsi::Runtime& rt) {
|
4
|
-
std::vector<jsi::PropNameID> properties;
|
5
|
-
|
6
|
-
// getters
|
7
|
-
properties.push_back(jsi::PropNameID::forUtf8(rt, std::string("theme")));
|
8
|
-
properties.push_back(jsi::PropNameID::forUtf8(rt, std::string("breakpoint")));
|
9
|
-
properties.push_back(jsi::PropNameID::forUtf8(rt, std::string("colorScheme")));
|
10
|
-
properties.push_back(jsi::PropNameID::forUtf8(rt, std::string("sortedBreakpointPairs")));
|
11
|
-
|
12
|
-
// setters
|
13
|
-
properties.push_back(jsi::PropNameID::forUtf8(rt, std::string("useBreakpoints")));
|
14
|
-
properties.push_back(jsi::PropNameID::forUtf8(rt, std::string("useTheme")));
|
15
|
-
properties.push_back(jsi::PropNameID::forUtf8(rt, std::string("useColorScheme")));
|
16
|
-
properties.push_back(jsi::PropNameID::forUtf8(rt, std::string("useFeatureFlags")));
|
17
|
-
|
18
|
-
return properties;
|
19
|
-
}
|
20
|
-
|
21
|
-
|
22
|
-
jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& propNameId) {
|
23
|
-
std::string propName = propNameId.utf8(runtime);
|
24
|
-
|
25
|
-
if (propName == "theme") {
|
26
|
-
return !this->theme.empty()
|
27
|
-
? jsi::Value(jsi::String::createFromUtf8(runtime, this->theme))
|
28
|
-
: jsi::Value::undefined();
|
29
|
-
}
|
30
|
-
|
31
|
-
if (propName == "breakpoint") {
|
32
|
-
return !this->breakpoint.empty()
|
33
|
-
? jsi::Value(jsi::String::createFromUtf8(runtime, this->breakpoint))
|
34
|
-
: jsi::Value::undefined();
|
35
|
-
}
|
36
|
-
|
37
|
-
if (propName == "colorScheme") {
|
38
|
-
return !this->colorScheme.empty()
|
39
|
-
? jsi::Value(jsi::String::createFromUtf8(runtime, this->colorScheme))
|
40
|
-
: jsi::Value::undefined();
|
41
|
-
}
|
42
|
-
|
43
|
-
if (propName == "sortedBreakpointPairs") {
|
44
|
-
std::unique_ptr<jsi::Array> sortedBreakpointEntriesArray = std::make_unique<jsi::Array>(runtime, this->sortedBreakpointEntries.size());
|
45
|
-
|
46
|
-
for (size_t i = 0; i < this->sortedBreakpointEntries.size(); ++i) {
|
47
|
-
std::unique_ptr<jsi::Array> pairArray = std::make_unique<jsi::Array>(runtime, 2);
|
48
|
-
jsi::String nameValue = jsi::String::createFromUtf8(runtime, this->sortedBreakpointEntries[i].first);
|
49
|
-
|
50
|
-
pairArray->setValueAtIndex(runtime, 0, nameValue);
|
51
|
-
pairArray->setValueAtIndex(runtime, 1, jsi::Value(this->sortedBreakpointEntries[i].second));
|
52
|
-
sortedBreakpointEntriesArray->setValueAtIndex(runtime, i, *pairArray);
|
53
|
-
}
|
54
|
-
|
55
|
-
return jsi::Value(runtime, *sortedBreakpointEntriesArray);
|
56
|
-
}
|
57
|
-
|
58
|
-
if (propName == "useBreakpoints") {
|
59
|
-
return jsi::Function::createFromHostFunction(
|
60
|
-
runtime,
|
61
|
-
jsi::PropNameID::forAscii(runtime, "useBreakpoints"),
|
62
|
-
1,
|
63
|
-
[this](jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count) -> jsi::Value {
|
64
|
-
jsi::Object breakpointsObj = arguments[0].asObject(runtime);
|
65
|
-
jsi::Array propertyNames = breakpointsObj.getPropertyNames(runtime);
|
66
|
-
std::vector<std::pair<std::string, double>> sortedBreakpointEntriesVec;
|
67
|
-
|
68
|
-
for (size_t i = 0; i < propertyNames.size(runtime); ++i) {
|
69
|
-
jsi::Value propNameValue = propertyNames.getValueAtIndex(runtime, i);
|
70
|
-
std::string name = propNameValue.asString(runtime).utf8(runtime);
|
71
|
-
jsi::PropNameID propNameID = jsi::PropNameID::forUtf8(runtime, name);
|
72
|
-
jsi::Value value = breakpointsObj.getProperty(runtime, propNameID);
|
73
|
-
|
74
|
-
if (value.isNumber()) {
|
75
|
-
double breakpointValue = value.asNumber();
|
76
|
-
sortedBreakpointEntriesVec.push_back(std::make_pair(name, breakpointValue));
|
77
|
-
}
|
78
|
-
}
|
79
|
-
|
80
|
-
std::sort(sortedBreakpointEntriesVec.begin(), sortedBreakpointEntriesVec.end(), [](const std::pair<std::string, double>& a, const std::pair<std::string, double>& b) {
|
81
|
-
return a.second < b.second;
|
82
|
-
});
|
83
|
-
|
84
|
-
this->sortedBreakpointEntries = sortedBreakpointEntriesVec;
|
85
|
-
|
86
|
-
std::string breakpoint = this->getBreakpointFromScreenWidth(this->screenWidth, sortedBreakpointEntriesVec);
|
87
|
-
|
88
|
-
this->breakpoint = breakpoint;
|
89
|
-
|
90
|
-
return jsi::Value::undefined();
|
91
|
-
}
|
92
|
-
);
|
93
|
-
}
|
94
|
-
|
95
|
-
if (propName == "useTheme") {
|
96
|
-
return jsi::Function::createFromHostFunction(runtime,
|
97
|
-
jsi::PropNameID::forAscii(runtime, "useTheme"),
|
98
|
-
1,
|
99
|
-
[this](jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count) -> jsi::Value {
|
100
|
-
std::string themeName = arguments[0].asString(runtime).utf8(runtime);
|
101
|
-
NSString *currentTheme = [NSString stringWithUTF8String:themeName.c_str()];
|
102
|
-
|
103
|
-
this->theme = themeName;
|
104
|
-
|
105
|
-
NSDictionary *body = @{
|
106
|
-
@"type": @"theme",
|
107
|
-
@"payload": @{
|
108
|
-
@"currentTheme": currentTheme
|
109
|
-
}
|
110
|
-
};
|
111
|
-
this->eventHandler(body);
|
112
|
-
|
113
|
-
return jsi::Value::undefined();
|
114
|
-
}
|
115
|
-
);
|
116
|
-
}
|
117
|
-
|
118
|
-
if (propName == "useColorScheme") {
|
119
|
-
return jsi::Function::createFromHostFunction(runtime,
|
120
|
-
jsi::PropNameID::forAscii(runtime, "useColorScheme"),
|
121
|
-
1,
|
122
|
-
[this](jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count) -> jsi::Value {
|
123
|
-
std::string colorScheme = arguments[0].asString(runtime).utf8(runtime);
|
124
|
-
|
125
|
-
this->colorScheme = colorScheme;
|
126
|
-
|
127
|
-
return jsi::Value::undefined();
|
128
|
-
}
|
129
|
-
);
|
130
|
-
}
|
131
|
-
|
132
|
-
if (propName == "useFeatureFlags") {
|
133
|
-
return jsi::Function::createFromHostFunction(runtime,
|
134
|
-
jsi::PropNameID::forAscii(runtime, "useFeatureFlags"),
|
135
|
-
1,
|
136
|
-
[this](jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count) -> jsi::Value {
|
137
|
-
jsi::Array featureFlagsArray = arguments[0].asObject(runtime).asArray(runtime);
|
138
|
-
size_t length = featureFlagsArray.size(runtime);
|
139
|
-
std::vector<std::string> featureFlags;
|
140
|
-
featureFlags.reserve(length);
|
141
|
-
|
142
|
-
for (size_t i = 0; i < length; ++i) {
|
143
|
-
jsi::Value element = featureFlagsArray.getValueAtIndex(runtime, i);
|
144
|
-
|
145
|
-
if (element.isString()) {
|
146
|
-
std::string featureFlag = element.asString(runtime).utf8(runtime);
|
147
|
-
featureFlags.push_back(featureFlag);
|
148
|
-
}
|
149
|
-
}
|
150
|
-
|
151
|
-
this->featureFlags = featureFlags;
|
152
|
-
|
153
|
-
return jsi::Value::undefined();
|
154
|
-
}
|
155
|
-
);
|
156
|
-
}
|
157
|
-
|
158
|
-
return jsi::Value::undefined();
|
159
|
-
}
|
160
|
-
|
161
|
-
std::string UnistylesRuntime::getBreakpointFromScreenWidth(double width, const std::vector<std::pair<std::string, double>>& sortedBreakpointEntries) {
|
162
|
-
for (size_t i = 0; i < sortedBreakpointEntries.size(); ++i) {
|
163
|
-
const auto& [key, value] = sortedBreakpointEntries[i];
|
164
|
-
const double maxVal = (i + 1 < sortedBreakpointEntries.size()) ? sortedBreakpointEntries[i + 1].second : std::numeric_limits<double>::infinity();
|
165
|
-
|
166
|
-
if (width >= value && width < maxVal) {
|
167
|
-
return key;
|
168
|
-
}
|
169
|
-
}
|
170
|
-
|
171
|
-
return sortedBreakpointEntries.empty() ? "" : sortedBreakpointEntries.back().first;
|
172
|
-
}
|
173
|
-
|
174
|
-
void UnistylesRuntime::handleScreenSizeChangeWithWidth(CGFloat width, CGFloat height) {
|
175
|
-
std::string currentBreakpoint = this->breakpoint;
|
176
|
-
std::string nextBreakpoint = this->getBreakpointFromScreenWidth(width, this->sortedBreakpointEntries);
|
177
|
-
|
178
|
-
if (currentBreakpoint != nextBreakpoint) {
|
179
|
-
this->breakpoint = nextBreakpoint;
|
180
|
-
|
181
|
-
NSString *breakpoint = [NSString stringWithUTF8String:nextBreakpoint.c_str()];
|
182
|
-
NSDictionary *body = @{
|
183
|
-
@"type": @"breakpoint",
|
184
|
-
@"payload": @{
|
185
|
-
@"currentBreakpoint": breakpoint
|
186
|
-
}
|
187
|
-
};
|
188
|
-
|
189
|
-
this->eventHandler(body);
|
190
|
-
}
|
191
|
-
}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../../examples/expo/src/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAgBzB,eAAO,MAAM,GAAG,EAAE,KAAK,CAAC,iBAMvB,CAAA"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"Cxx.d.ts","sourceRoot":"","sources":["../../../../../../examples/expo/src/examples/Cxx.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,eAAO,MAAM,GAAG,yBA+Cf,CAAA"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../examples/expo/src/examples/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../examples/expo/src/index.ts"],"names":[],"mappings":""}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"breakpoints.d.ts","sourceRoot":"","sources":["../../../../../../examples/expo/src/styles/breakpoints.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;CAMvB,CAAA"}
|