@tamagui/web 1.101.1 → 1.101.2
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/dist/cjs/createComponent.js +1 -1
- package/dist/cjs/createComponent.js.map +1 -1
- package/dist/cjs/createComponent.native.js +1 -1
- package/dist/cjs/createComponent.native.js.map +2 -2
- package/dist/cjs/hooks/useDidHydrateOnce.js +2 -10
- package/dist/cjs/hooks/useDidHydrateOnce.js.map +1 -1
- package/dist/cjs/hooks/useDidHydrateOnce.native.js +2 -2
- package/dist/cjs/hooks/useDidHydrateOnce.native.js.map +2 -2
- package/dist/cjs/hooks/useMedia.js +35 -27
- package/dist/cjs/hooks/useMedia.js.map +2 -2
- package/dist/cjs/hooks/useMedia.native.js +34 -47
- package/dist/cjs/hooks/useMedia.native.js.map +2 -2
- package/dist/esm/createComponent.js +1 -1
- package/dist/esm/createComponent.js.map +1 -1
- package/dist/esm/createComponent.mjs +1 -1
- package/dist/esm/createComponent.native.js +1 -1
- package/dist/esm/createComponent.native.js.map +2 -2
- package/dist/esm/hooks/useDidHydrateOnce.js +3 -11
- package/dist/esm/hooks/useDidHydrateOnce.js.map +1 -1
- package/dist/esm/hooks/useDidHydrateOnce.mjs +3 -11
- package/dist/esm/hooks/useDidHydrateOnce.native.js +1 -2
- package/dist/esm/hooks/useDidHydrateOnce.native.js.map +2 -2
- package/dist/esm/hooks/useMedia.js +35 -28
- package/dist/esm/hooks/useMedia.js.map +2 -2
- package/dist/esm/hooks/useMedia.mjs +30 -37
- package/dist/esm/hooks/useMedia.native.js +34 -48
- package/dist/esm/hooks/useMedia.native.js.map +2 -2
- package/package.json +11 -11
- package/src/createComponent.tsx +1 -1
- package/src/hooks/useDidHydrateOnce.tsx +21 -21
- package/src/hooks/useMedia.tsx +69 -56
- package/types/hooks/useMedia.d.ts +5 -5
- package/types/hooks/useMedia.d.ts.map +1 -1
package/src/hooks/useMedia.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isServer, isWeb, useIsomorphicLayoutEffect } from '@tamagui/constants'
|
|
2
|
-
import { useRef, useState } from 'react'
|
|
3
|
-
|
|
2
|
+
import { useRef, useState, useSyncExternalStore } from 'react'
|
|
3
|
+
|
|
4
|
+
import { getConfig, setTokens } from '../config'
|
|
4
5
|
import { matchMedia } from '../helpers/matchMedia'
|
|
5
6
|
import { pseudoDescriptors } from '../helpers/pseudoDescriptors'
|
|
6
7
|
import type {
|
|
@@ -8,12 +9,12 @@ import type {
|
|
|
8
9
|
DebugProp,
|
|
9
10
|
IsMediaType,
|
|
10
11
|
MediaQueries,
|
|
12
|
+
MediaQueryKey,
|
|
11
13
|
MediaQueryObject,
|
|
12
14
|
MediaQueryState,
|
|
13
15
|
TamaguiInternalConfig,
|
|
14
16
|
UseMediaState,
|
|
15
17
|
} from '../types'
|
|
16
|
-
import { useDidHydrateOnce } from './useDidHydrateOnce'
|
|
17
18
|
import { getDisableSSR } from './useDisableSSR'
|
|
18
19
|
|
|
19
20
|
export let mediaState: MediaQueryState =
|
|
@@ -120,9 +121,7 @@ export function setupMediaListeners() {
|
|
|
120
121
|
setupVersion = mediaVersion
|
|
121
122
|
|
|
122
123
|
// hmr, undo existing before re-binding
|
|
123
|
-
|
|
124
|
-
unlisten()
|
|
125
|
-
}
|
|
124
|
+
unlisten()
|
|
126
125
|
|
|
127
126
|
for (const key in mediaQueryConfig) {
|
|
128
127
|
const str = mediaObjectToString(mediaQueryConfig[key], key)
|
|
@@ -169,46 +168,42 @@ type MediaKeysState = {
|
|
|
169
168
|
[key: string]: any
|
|
170
169
|
}
|
|
171
170
|
|
|
172
|
-
type
|
|
171
|
+
type MediaState = {
|
|
172
|
+
prev?: MediaKeysState
|
|
173
173
|
enabled?: boolean
|
|
174
|
-
|
|
175
|
-
touched?: string[] | null
|
|
174
|
+
keys?: MediaQueryKey[] | null
|
|
176
175
|
}
|
|
177
176
|
|
|
178
|
-
const States = new WeakMap<any,
|
|
177
|
+
const States = new WeakMap<any, MediaState>()
|
|
179
178
|
|
|
180
|
-
export function setMediaShouldUpdate(ref: any, props:
|
|
179
|
+
export function setMediaShouldUpdate(ref: any, props: MediaState) {
|
|
181
180
|
return States.set(ref, {
|
|
182
181
|
...(States.get(ref) as any),
|
|
183
182
|
...props,
|
|
184
183
|
})
|
|
185
184
|
}
|
|
186
185
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
const hasntUpdated = !touched || touched.every((key) => mediaState[key] === prev[key])
|
|
192
|
-
if (hasntUpdated) {
|
|
193
|
-
return prev
|
|
194
|
-
}
|
|
195
|
-
return mediaState
|
|
186
|
+
type UseMediaInternalState = {
|
|
187
|
+
prev: MediaKeysState
|
|
188
|
+
keys?: string[]
|
|
196
189
|
}
|
|
197
190
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
191
|
+
function subscribe(subscriber: any) {
|
|
192
|
+
listeners.add(subscriber)
|
|
193
|
+
return () => {
|
|
194
|
+
listeners.delete(subscriber)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
201
197
|
|
|
202
198
|
export function useMedia(
|
|
203
199
|
uidIn?: any,
|
|
204
200
|
componentContext?: ComponentContextI,
|
|
205
|
-
debug
|
|
201
|
+
debug?: DebugProp
|
|
206
202
|
): UseMediaState {
|
|
207
203
|
const uid = uidIn ?? useRef()
|
|
208
|
-
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
const initialState = isHydrated ? mediaState : initState
|
|
204
|
+
// performance boost to avoid using context twice
|
|
205
|
+
const disableSSR = getDisableSSR(componentContext)
|
|
206
|
+
const initialState = (disableSSR || !isWeb ? mediaState : initState) || {}
|
|
212
207
|
|
|
213
208
|
let componentState = States.get(uid)
|
|
214
209
|
if (!componentState) {
|
|
@@ -216,43 +211,61 @@ export function useMedia(
|
|
|
216
211
|
States.set(uid, componentState)
|
|
217
212
|
}
|
|
218
213
|
|
|
219
|
-
const
|
|
214
|
+
const getSnapshot = () => {
|
|
215
|
+
if (!componentState) {
|
|
216
|
+
return initialState
|
|
217
|
+
}
|
|
220
218
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if (process.env.NODE_ENV === 'development' && debug) {
|
|
226
|
-
console.info('useMedia() update?', getSnapshot(componentState) !== prev, {
|
|
227
|
-
componentState,
|
|
228
|
-
touched: [...(componentState.touched || [])],
|
|
229
|
-
prev: { ...componentState.prev },
|
|
230
|
-
next: getSnapshot(componentState),
|
|
231
|
-
mediaState: { ...mediaState },
|
|
232
|
-
})
|
|
233
|
-
}
|
|
234
|
-
const next = getSnapshot(componentState)
|
|
235
|
-
if (next !== prev) {
|
|
236
|
-
componentState.prev = next
|
|
237
|
-
return next
|
|
238
|
-
}
|
|
239
|
-
return prev
|
|
240
|
-
})
|
|
219
|
+
const { keys, prev = initialState } = componentState
|
|
220
|
+
|
|
221
|
+
if (componentState && componentState.enabled === false) {
|
|
222
|
+
return prev
|
|
241
223
|
}
|
|
242
224
|
|
|
243
|
-
|
|
225
|
+
const testKeys =
|
|
226
|
+
componentState?.keys ??
|
|
227
|
+
((!componentState || componentState.enabled) && keys) ??
|
|
228
|
+
null
|
|
244
229
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
230
|
+
const hasntUpdated =
|
|
231
|
+
!testKeys || testKeys?.every((key) => mediaState[key] === prev[key])
|
|
232
|
+
|
|
233
|
+
if (hasntUpdated) {
|
|
234
|
+
return prev
|
|
248
235
|
}
|
|
249
|
-
|
|
236
|
+
|
|
237
|
+
componentState.prev = mediaState
|
|
238
|
+
|
|
239
|
+
return mediaState
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
let state: MediaQueryState
|
|
243
|
+
|
|
244
|
+
if (process.env.TAMAGUI_SYNC_MEDIA_QUERY) {
|
|
245
|
+
state = useSyncExternalStore<MediaQueryState>(
|
|
246
|
+
subscribe,
|
|
247
|
+
getSnapshot,
|
|
248
|
+
() => initialState
|
|
249
|
+
)
|
|
250
|
+
} else {
|
|
251
|
+
const [internalState, setState] = useState(initialState)
|
|
252
|
+
state = internalState
|
|
253
|
+
|
|
254
|
+
useIsomorphicLayoutEffect(() => {
|
|
255
|
+
function update() {
|
|
256
|
+
setState(getSnapshot)
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
update()
|
|
260
|
+
return subscribe(update)
|
|
261
|
+
}, [])
|
|
262
|
+
}
|
|
250
263
|
|
|
251
264
|
return new Proxy(state, {
|
|
252
265
|
get(_, key) {
|
|
253
266
|
if (typeof key === 'string') {
|
|
254
|
-
componentState.
|
|
255
|
-
if (!componentState.
|
|
267
|
+
componentState.keys ||= []
|
|
268
|
+
if (!componentState.keys.includes(key)) componentState.keys.push(key)
|
|
256
269
|
if (process.env.NODE_ENV === 'development' && debug) {
|
|
257
270
|
console.info(`useMedia() TOUCH`, key)
|
|
258
271
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ComponentContextI, DebugProp, IsMediaType, MediaQueries, MediaQueryObject, MediaQueryState, TamaguiInternalConfig, UseMediaState } from '../types';
|
|
1
|
+
import type { ComponentContextI, DebugProp, IsMediaType, MediaQueries, MediaQueryKey, MediaQueryObject, MediaQueryState, TamaguiInternalConfig, UseMediaState } from '../types';
|
|
2
2
|
export declare let mediaState: MediaQueryState;
|
|
3
3
|
export declare const mediaQueryConfig: MediaQueries;
|
|
4
4
|
export declare const getMedia: () => MediaQueryState;
|
|
@@ -10,12 +10,12 @@ export declare function setupMediaListeners(): void;
|
|
|
10
10
|
type MediaKeysState = {
|
|
11
11
|
[key: string]: any;
|
|
12
12
|
};
|
|
13
|
-
type
|
|
13
|
+
type MediaState = {
|
|
14
|
+
prev?: MediaKeysState;
|
|
14
15
|
enabled?: boolean;
|
|
15
|
-
|
|
16
|
-
touched?: string[] | null;
|
|
16
|
+
keys?: MediaQueryKey[] | null;
|
|
17
17
|
};
|
|
18
|
-
export declare function setMediaShouldUpdate(ref: any, props:
|
|
18
|
+
export declare function setMediaShouldUpdate(ref: any, props: MediaState): WeakMap<any, MediaState>;
|
|
19
19
|
export declare function useMedia(uidIn?: any, componentContext?: ComponentContextI, debug?: DebugProp): UseMediaState;
|
|
20
20
|
export declare const getMediaImportanceIfMoreImportant: (mediaKey: string, key: string, importancesUsed: Record<string, number>, isSizeMedia: boolean) => number | null;
|
|
21
21
|
export declare function mediaObjectToString(query: string | MediaQueryObject, key?: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMedia.d.ts","sourceRoot":"","sources":["../../src/hooks/useMedia.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useMedia.d.ts","sourceRoot":"","sources":["../../src/hooks/useMedia.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,aAAa,EACd,MAAM,UAAU,CAAA;AAGjB,eAAO,IAAI,UAAU,EAAE,eAmBN,CAAA;AAEjB,eAAO,MAAM,gBAAgB,EAAE,YAAiB,CAAA;AAEhD,eAAO,MAAM,QAAQ,uBAAmB,CAAA;AAExC,eAAO,MAAM,SAAS,aAAoB,CAAA;AAI1C,eAAO,MAAM,UAAU,QAAS,MAAM,KAAG,WAOxC,CAAA;AAUD,eAAO,MAAM,qBAAqB,QAAS,MAAM,WAchD,CAAA;AAMD,eAAO,MAAM,cAAc,WAAY,qBAAqB,SAiB3D,CAAA;AAaD,wBAAgB,mBAAmB,SAiClC;AAkBD,KAAK,cAAc,GAAG;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAAA;CAC9B,CAAA;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,4BAK/D;AAcD,wBAAgB,QAAQ,CACtB,KAAK,CAAC,EAAE,GAAG,EACX,gBAAgB,CAAC,EAAE,iBAAiB,EACpC,KAAK,CAAC,EAAE,SAAS,GAChB,aAAa,CA0Ef;AAED,eAAO,MAAM,iCAAiC,aAClC,MAAM,OACX,MAAM,mBACM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,eAC1B,OAAO,kBAQrB,CAAA;AASD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,UAwBjF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,UAE1C;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,WAY9C"}
|