@withease/web-api
Advanced tools
+359
| 'use strict'; | ||
| Object.defineProperty(exports, '__esModule', { value: true }); | ||
| var effector = require('effector'); | ||
| function readValue(getter, defaultValue) { | ||
| try { | ||
| const value = getter(); | ||
| if (value === undefined) { | ||
| return defaultValue; | ||
| } | ||
| return value; | ||
| } catch (e) { | ||
| return defaultValue; | ||
| } | ||
| } | ||
| function setupListener({ | ||
| add, | ||
| remove, | ||
| readPayload | ||
| }, config) { | ||
| const event = effector.createEvent(); | ||
| const $subscription = effector.createStore(null, { | ||
| serialize: 'ignore' | ||
| }); | ||
| const startWatchingFx = effector.createEffect(() => { | ||
| const boundEvent = effector.scopeBind(event, { | ||
| safe: true | ||
| }); | ||
| let listener = boundEvent; | ||
| if (readPayload) { | ||
| listener = () => boundEvent(readPayload()); | ||
| } | ||
| add(listener); | ||
| return listener; | ||
| }); | ||
| const stopWatchingFx = effector.attach({ | ||
| source: $subscription, | ||
| effect(subscription) { | ||
| if (!subscription) return; | ||
| remove(subscription); | ||
| } | ||
| }); | ||
| effector.sample({ | ||
| clock: config.setup, | ||
| target: startWatchingFx | ||
| }); | ||
| effector.sample({ | ||
| clock: startWatchingFx.doneData, | ||
| filter: Boolean, | ||
| target: $subscription | ||
| }); | ||
| if (config.teardown) { | ||
| effector.sample({ | ||
| clock: config.teardown, | ||
| target: stopWatchingFx | ||
| }); | ||
| } | ||
| effector.sample({ | ||
| clock: stopWatchingFx.done, | ||
| target: $subscription.reinit | ||
| }); | ||
| return event; | ||
| } | ||
| const trackScreenOrientation = config => { | ||
| const $type = effector.createStore(readValue(() => screen.orientation.type, null), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const $angle = effector.createStore(readValue(() => screen.orientation.angle, null), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const orientationChanged = setupListener({ | ||
| add: listener => screen.orientation.addEventListener('change', listener), | ||
| remove: listener => screen.orientation.removeEventListener('change', listener), | ||
| readPayload: () => screen.orientation | ||
| }, config); | ||
| effector.sample({ | ||
| clock: orientationChanged, | ||
| fn: () => screen.orientation.type, | ||
| target: $type | ||
| }); | ||
| effector.sample({ | ||
| clock: orientationChanged, | ||
| fn: () => screen.orientation.angle, | ||
| target: $angle | ||
| }); | ||
| return { | ||
| $type, | ||
| $angle | ||
| }; | ||
| }; | ||
| trackScreenOrientation['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| $type | ||
| } = trackScreenOrientation({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| const fired = effector.sample({ | ||
| clock: $type.updates, | ||
| fn: () => {// noop | ||
| } | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired | ||
| }; | ||
| }; | ||
| const trackPageVisibility = config => { | ||
| const visibilityChanged = setupListener({ | ||
| add: listener => document.addEventListener('visibilitychange', listener), | ||
| remove: listener => document.removeEventListener('visibilitychange', listener), | ||
| readPayload: () => document.visibilityState | ||
| }, config); | ||
| const $visibilityState = effector.createStore(readValue(() => document.visibilityState, 'visible'), { | ||
| serialize: 'ignore' | ||
| }).on(visibilityChanged, (_, state) => state); // -- Public API | ||
| const $visible = $visibilityState.map(state => state === 'visible'); | ||
| const $hidden = $visibilityState.map(state => state === 'hidden'); | ||
| const visible = effector.sample({ | ||
| clock: $visible.updates, | ||
| filter: Boolean, | ||
| fn: () => {// | ||
| } | ||
| }); | ||
| const hidden = effector.sample({ | ||
| clock: $hidden.updates, | ||
| filter: Boolean, | ||
| fn: () => {// | ||
| } | ||
| }); // -- Result | ||
| return { | ||
| visible, | ||
| hidden, | ||
| $visible, | ||
| $hidden | ||
| }; | ||
| }; | ||
| trackPageVisibility['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| visible | ||
| } = trackPageVisibility({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: visible | ||
| }; | ||
| }; | ||
| const trackNetworkStatus = config => { | ||
| const online = setupListener({ | ||
| add: listener => window.addEventListener('online', listener), | ||
| remove: listener => window.removeEventListener('online', listener) | ||
| }, config); | ||
| const offline = setupListener({ | ||
| add: listener => window.addEventListener('offline', listener), | ||
| remove: listener => window.removeEventListener('offline', listener) | ||
| }, config); | ||
| const $online = effector.createStore(readValue(() => navigator.onLine, true), { | ||
| serialize: 'ignore' | ||
| }).on(online, () => true).on(offline, () => false); | ||
| const $offline = $online.map(online => !online); | ||
| return { | ||
| online, | ||
| offline, | ||
| $offline, | ||
| $online | ||
| }; | ||
| }; | ||
| trackNetworkStatus['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| online | ||
| } = trackNetworkStatus({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: online | ||
| }; | ||
| }; | ||
| function trackMediaQuery(mq, config) { | ||
| // single query | ||
| if (typeof mq === 'string') { | ||
| if (config) { | ||
| return tracker(mq, config); | ||
| } else { | ||
| const track = finalConfig => tracker(mq, finalConfig); | ||
| track['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| matched | ||
| } = tracker(mq, { | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: matched | ||
| }; | ||
| }; | ||
| return track; | ||
| } | ||
| } // multiple queries | ||
| else { | ||
| if (config) { | ||
| const resuls = {}; | ||
| for (const [mqKey, mqValue] of Object.entries(mq)) { | ||
| resuls[mqKey] = trackMediaQuery(mqValue, config); | ||
| } | ||
| return resuls; | ||
| } else { | ||
| const results = {}; | ||
| for (const [mqKey, mqValue] of Object.entries(mq)) { | ||
| results[mqKey] = finalConfig => trackMediaQuery(mqValue, finalConfig); | ||
| } | ||
| return results; | ||
| } | ||
| } | ||
| } | ||
| function tracker(query, config) { | ||
| var _a; | ||
| const mq = readValue(() => window.matchMedia(query), null); | ||
| const changed = setupListener({ | ||
| add: listener => mq === null || mq === void 0 ? void 0 : mq.addEventListener('change', listener), | ||
| remove: listener => mq === null || mq === void 0 ? void 0 : mq.removeEventListener('change', listener) | ||
| }, config); | ||
| const $matches = effector.createStore((_a = mq === null || mq === void 0 ? void 0 : mq.matches) !== null && _a !== void 0 ? _a : false, { | ||
| serialize: 'ignore' | ||
| }).on(changed, (_, event) => event.matches); | ||
| const matched = effector.createEvent(); | ||
| effector.sample({ | ||
| clock: [$matches.updates, config.setup], | ||
| filter: $matches, | ||
| fn: () => {// ... | ||
| }, | ||
| target: matched | ||
| }); | ||
| return { | ||
| $matches, | ||
| matched | ||
| }; | ||
| } | ||
| const $acceptLanguageHeader = effector.createStore(null, { | ||
| serialize: 'ignore' | ||
| }); | ||
| const $headerLanguages = $acceptLanguageHeader.map(header => { | ||
| if (!header) { | ||
| return []; | ||
| } | ||
| return header.split(',').map(lang => { | ||
| var _a; | ||
| return (_a = lang.split(';')[0]) === null || _a === void 0 ? void 0 : _a.trim(); | ||
| }).filter(lang => lang && lang !== '*'); | ||
| }); | ||
| const trackPreferredLanguages = config => { | ||
| const $navigatorLanguages = effector.createStore(readValue(() => navigator.languages, []), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const languagesChanged = setupListener({ | ||
| add: listener => window.addEventListener('languagechange', listener), | ||
| remove: listener => window.removeEventListener('languagechange', listener), | ||
| readPayload: () => navigator.languages | ||
| }, config); | ||
| effector.sample({ | ||
| clock: languagesChanged, | ||
| target: $navigatorLanguages | ||
| }); | ||
| const $languages = effector.combine({ | ||
| fromHeader: $headerLanguages, | ||
| fromNavigator: $navigatorLanguages | ||
| }, ({ | ||
| fromHeader, | ||
| fromNavigator | ||
| }) => fromHeader.length > 0 ? fromHeader : fromNavigator); | ||
| const $language = $languages.map(languages => { | ||
| var _a; | ||
| return (_a = languages[0]) !== null && _a !== void 0 ? _a : null; | ||
| }); | ||
| const languageChanged = effector.sample({ | ||
| clock: languagesChanged, | ||
| fn() {// noop | ||
| } | ||
| }); | ||
| return { | ||
| $languages, | ||
| $language, | ||
| languageChanged | ||
| }; | ||
| }; | ||
| trackPreferredLanguages['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| languageChanged | ||
| } = trackPreferredLanguages({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: languageChanged | ||
| }; | ||
| }; | ||
| trackPreferredLanguages.$acceptLanguageHeader = $acceptLanguageHeader; | ||
| exports.trackMediaQuery = trackMediaQuery; | ||
| exports.trackNetworkStatus = trackNetworkStatus; | ||
| exports.trackPageVisibility = trackPageVisibility; | ||
| exports.trackPreferredLanguages = trackPreferredLanguages; | ||
| exports.trackScreenOrientation = trackScreenOrientation; |
+351
| import { createEvent, createStore, createEffect, scopeBind, attach, sample, combine } from 'effector'; | ||
| function readValue(getter, defaultValue) { | ||
| try { | ||
| const value = getter(); | ||
| if (value === undefined) { | ||
| return defaultValue; | ||
| } | ||
| return value; | ||
| } catch (e) { | ||
| return defaultValue; | ||
| } | ||
| } | ||
| function setupListener({ | ||
| add, | ||
| remove, | ||
| readPayload | ||
| }, config) { | ||
| const event = createEvent(); | ||
| const $subscription = createStore(null, { | ||
| serialize: 'ignore' | ||
| }); | ||
| const startWatchingFx = createEffect(() => { | ||
| const boundEvent = scopeBind(event, { | ||
| safe: true | ||
| }); | ||
| let listener = boundEvent; | ||
| if (readPayload) { | ||
| listener = () => boundEvent(readPayload()); | ||
| } | ||
| add(listener); | ||
| return listener; | ||
| }); | ||
| const stopWatchingFx = attach({ | ||
| source: $subscription, | ||
| effect(subscription) { | ||
| if (!subscription) return; | ||
| remove(subscription); | ||
| } | ||
| }); | ||
| sample({ | ||
| clock: config.setup, | ||
| target: startWatchingFx | ||
| }); | ||
| sample({ | ||
| clock: startWatchingFx.doneData, | ||
| filter: Boolean, | ||
| target: $subscription | ||
| }); | ||
| if (config.teardown) { | ||
| sample({ | ||
| clock: config.teardown, | ||
| target: stopWatchingFx | ||
| }); | ||
| } | ||
| sample({ | ||
| clock: stopWatchingFx.done, | ||
| target: $subscription.reinit | ||
| }); | ||
| return event; | ||
| } | ||
| const trackScreenOrientation = config => { | ||
| const $type = createStore(readValue(() => screen.orientation.type, null), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const $angle = createStore(readValue(() => screen.orientation.angle, null), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const orientationChanged = setupListener({ | ||
| add: listener => screen.orientation.addEventListener('change', listener), | ||
| remove: listener => screen.orientation.removeEventListener('change', listener), | ||
| readPayload: () => screen.orientation | ||
| }, config); | ||
| sample({ | ||
| clock: orientationChanged, | ||
| fn: () => screen.orientation.type, | ||
| target: $type | ||
| }); | ||
| sample({ | ||
| clock: orientationChanged, | ||
| fn: () => screen.orientation.angle, | ||
| target: $angle | ||
| }); | ||
| return { | ||
| $type, | ||
| $angle | ||
| }; | ||
| }; | ||
| trackScreenOrientation['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| $type | ||
| } = trackScreenOrientation({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| const fired = sample({ | ||
| clock: $type.updates, | ||
| fn: () => {// noop | ||
| } | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired | ||
| }; | ||
| }; | ||
| const trackPageVisibility = config => { | ||
| const visibilityChanged = setupListener({ | ||
| add: listener => document.addEventListener('visibilitychange', listener), | ||
| remove: listener => document.removeEventListener('visibilitychange', listener), | ||
| readPayload: () => document.visibilityState | ||
| }, config); | ||
| const $visibilityState = createStore(readValue(() => document.visibilityState, 'visible'), { | ||
| serialize: 'ignore' | ||
| }).on(visibilityChanged, (_, state) => state); // -- Public API | ||
| const $visible = $visibilityState.map(state => state === 'visible'); | ||
| const $hidden = $visibilityState.map(state => state === 'hidden'); | ||
| const visible = sample({ | ||
| clock: $visible.updates, | ||
| filter: Boolean, | ||
| fn: () => {// | ||
| } | ||
| }); | ||
| const hidden = sample({ | ||
| clock: $hidden.updates, | ||
| filter: Boolean, | ||
| fn: () => {// | ||
| } | ||
| }); // -- Result | ||
| return { | ||
| visible, | ||
| hidden, | ||
| $visible, | ||
| $hidden | ||
| }; | ||
| }; | ||
| trackPageVisibility['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| visible | ||
| } = trackPageVisibility({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: visible | ||
| }; | ||
| }; | ||
| const trackNetworkStatus = config => { | ||
| const online = setupListener({ | ||
| add: listener => window.addEventListener('online', listener), | ||
| remove: listener => window.removeEventListener('online', listener) | ||
| }, config); | ||
| const offline = setupListener({ | ||
| add: listener => window.addEventListener('offline', listener), | ||
| remove: listener => window.removeEventListener('offline', listener) | ||
| }, config); | ||
| const $online = createStore(readValue(() => navigator.onLine, true), { | ||
| serialize: 'ignore' | ||
| }).on(online, () => true).on(offline, () => false); | ||
| const $offline = $online.map(online => !online); | ||
| return { | ||
| online, | ||
| offline, | ||
| $offline, | ||
| $online | ||
| }; | ||
| }; | ||
| trackNetworkStatus['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| online | ||
| } = trackNetworkStatus({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: online | ||
| }; | ||
| }; | ||
| function trackMediaQuery(mq, config) { | ||
| // single query | ||
| if (typeof mq === 'string') { | ||
| if (config) { | ||
| return tracker(mq, config); | ||
| } else { | ||
| const track = finalConfig => tracker(mq, finalConfig); | ||
| track['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| matched | ||
| } = tracker(mq, { | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: matched | ||
| }; | ||
| }; | ||
| return track; | ||
| } | ||
| } // multiple queries | ||
| else { | ||
| if (config) { | ||
| const resuls = {}; | ||
| for (const [mqKey, mqValue] of Object.entries(mq)) { | ||
| resuls[mqKey] = trackMediaQuery(mqValue, config); | ||
| } | ||
| return resuls; | ||
| } else { | ||
| const results = {}; | ||
| for (const [mqKey, mqValue] of Object.entries(mq)) { | ||
| results[mqKey] = finalConfig => trackMediaQuery(mqValue, finalConfig); | ||
| } | ||
| return results; | ||
| } | ||
| } | ||
| } | ||
| function tracker(query, config) { | ||
| var _a; | ||
| const mq = readValue(() => window.matchMedia(query), null); | ||
| const changed = setupListener({ | ||
| add: listener => mq === null || mq === void 0 ? void 0 : mq.addEventListener('change', listener), | ||
| remove: listener => mq === null || mq === void 0 ? void 0 : mq.removeEventListener('change', listener) | ||
| }, config); | ||
| const $matches = createStore((_a = mq === null || mq === void 0 ? void 0 : mq.matches) !== null && _a !== void 0 ? _a : false, { | ||
| serialize: 'ignore' | ||
| }).on(changed, (_, event) => event.matches); | ||
| const matched = createEvent(); | ||
| sample({ | ||
| clock: [$matches.updates, config.setup], | ||
| filter: $matches, | ||
| fn: () => {// ... | ||
| }, | ||
| target: matched | ||
| }); | ||
| return { | ||
| $matches, | ||
| matched | ||
| }; | ||
| } | ||
| const $acceptLanguageHeader = createStore(null, { | ||
| serialize: 'ignore' | ||
| }); | ||
| const $headerLanguages = $acceptLanguageHeader.map(header => { | ||
| if (!header) { | ||
| return []; | ||
| } | ||
| return header.split(',').map(lang => { | ||
| var _a; | ||
| return (_a = lang.split(';')[0]) === null || _a === void 0 ? void 0 : _a.trim(); | ||
| }).filter(lang => lang && lang !== '*'); | ||
| }); | ||
| const trackPreferredLanguages = config => { | ||
| const $navigatorLanguages = createStore(readValue(() => navigator.languages, []), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const languagesChanged = setupListener({ | ||
| add: listener => window.addEventListener('languagechange', listener), | ||
| remove: listener => window.removeEventListener('languagechange', listener), | ||
| readPayload: () => navigator.languages | ||
| }, config); | ||
| sample({ | ||
| clock: languagesChanged, | ||
| target: $navigatorLanguages | ||
| }); | ||
| const $languages = combine({ | ||
| fromHeader: $headerLanguages, | ||
| fromNavigator: $navigatorLanguages | ||
| }, ({ | ||
| fromHeader, | ||
| fromNavigator | ||
| }) => fromHeader.length > 0 ? fromHeader : fromNavigator); | ||
| const $language = $languages.map(languages => { | ||
| var _a; | ||
| return (_a = languages[0]) !== null && _a !== void 0 ? _a : null; | ||
| }); | ||
| const languageChanged = sample({ | ||
| clock: languagesChanged, | ||
| fn() {// noop | ||
| } | ||
| }); | ||
| return { | ||
| $languages, | ||
| $language, | ||
| languageChanged | ||
| }; | ||
| }; | ||
| trackPreferredLanguages['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| languageChanged | ||
| } = trackPreferredLanguages({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: languageChanged | ||
| }; | ||
| }; | ||
| trackPreferredLanguages.$acceptLanguageHeader = $acceptLanguageHeader; | ||
| export { trackMediaQuery, trackNetworkStatus, trackPageVisibility, trackPreferredLanguages, trackScreenOrientation }; |
+8
-8
| { | ||
| "name": "@withease/web-api", | ||
| "version": "1.0.0", | ||
| "type": "commonjs", | ||
| "version": "1.0.1", | ||
| "type": "module", | ||
| "peerDependencies": { | ||
| "effector": "^22.5.0" | ||
| }, | ||
| "module": "./index.js", | ||
| "main": "./index.cjs", | ||
| "types": "./index.d.ts", | ||
| "exports": { | ||
| "./package.json": "./package.json", | ||
| ".": { | ||
| "module": "./index.esm.js", | ||
| "import": "./index.cjs.mjs", | ||
| "default": "./index.cjs.js" | ||
| "types": "./index.d.ts", | ||
| "import": "./index.js", | ||
| "require": "./index.cjs" | ||
| } | ||
| }, | ||
| "module": "./index.esm.js", | ||
| "main": "./index.cjs.js", | ||
| "publishConfig": { | ||
@@ -19,0 +19,0 @@ "access": "public" |
| export * from "./index"; |
| exports._default = require('./index.cjs.js').default; |
-359
| 'use strict'; | ||
| Object.defineProperty(exports, '__esModule', { value: true }); | ||
| var effector = require('effector'); | ||
| function readValue(getter, defaultValue) { | ||
| try { | ||
| const value = getter(); | ||
| if (value === undefined) { | ||
| return defaultValue; | ||
| } | ||
| return value; | ||
| } catch (e) { | ||
| return defaultValue; | ||
| } | ||
| } | ||
| function setupListener({ | ||
| add, | ||
| remove, | ||
| readPayload | ||
| }, config) { | ||
| const event = effector.createEvent(); | ||
| const $subscription = effector.createStore(null, { | ||
| serialize: 'ignore' | ||
| }); | ||
| const startWatchingFx = effector.createEffect(() => { | ||
| const boundEvent = effector.scopeBind(event, { | ||
| safe: true | ||
| }); | ||
| let listener = boundEvent; | ||
| if (readPayload) { | ||
| listener = () => boundEvent(readPayload()); | ||
| } | ||
| add(listener); | ||
| return listener; | ||
| }); | ||
| const stopWatchingFx = effector.attach({ | ||
| source: $subscription, | ||
| effect(subscription) { | ||
| if (!subscription) return; | ||
| remove(subscription); | ||
| } | ||
| }); | ||
| effector.sample({ | ||
| clock: config.setup, | ||
| target: startWatchingFx | ||
| }); | ||
| effector.sample({ | ||
| clock: startWatchingFx.doneData, | ||
| filter: Boolean, | ||
| target: $subscription | ||
| }); | ||
| if (config.teardown) { | ||
| effector.sample({ | ||
| clock: config.teardown, | ||
| target: stopWatchingFx | ||
| }); | ||
| } | ||
| effector.sample({ | ||
| clock: stopWatchingFx.done, | ||
| target: $subscription.reinit | ||
| }); | ||
| return event; | ||
| } | ||
| const trackScreenOrientation = config => { | ||
| const $type = effector.createStore(readValue(() => screen.orientation.type, null), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const $angle = effector.createStore(readValue(() => screen.orientation.angle, null), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const orientationChanged = setupListener({ | ||
| add: listener => screen.orientation.addEventListener('change', listener), | ||
| remove: listener => screen.orientation.removeEventListener('change', listener), | ||
| readPayload: () => screen.orientation | ||
| }, config); | ||
| effector.sample({ | ||
| clock: orientationChanged, | ||
| fn: () => screen.orientation.type, | ||
| target: $type | ||
| }); | ||
| effector.sample({ | ||
| clock: orientationChanged, | ||
| fn: () => screen.orientation.angle, | ||
| target: $angle | ||
| }); | ||
| return { | ||
| $type, | ||
| $angle | ||
| }; | ||
| }; | ||
| trackScreenOrientation['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| $type | ||
| } = trackScreenOrientation({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| const fired = effector.sample({ | ||
| clock: $type.updates, | ||
| fn: () => {// noop | ||
| } | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired | ||
| }; | ||
| }; | ||
| const trackPageVisibility = config => { | ||
| const visibilityChanged = setupListener({ | ||
| add: listener => document.addEventListener('visibilitychange', listener), | ||
| remove: listener => document.removeEventListener('visibilitychange', listener), | ||
| readPayload: () => document.visibilityState | ||
| }, config); | ||
| const $visibilityState = effector.createStore(readValue(() => document.visibilityState, 'visible'), { | ||
| serialize: 'ignore' | ||
| }).on(visibilityChanged, (_, state) => state); // -- Public API | ||
| const $visible = $visibilityState.map(state => state === 'visible'); | ||
| const $hidden = $visibilityState.map(state => state === 'hidden'); | ||
| const visible = effector.sample({ | ||
| clock: $visible.updates, | ||
| filter: Boolean, | ||
| fn: () => {// | ||
| } | ||
| }); | ||
| const hidden = effector.sample({ | ||
| clock: $hidden.updates, | ||
| filter: Boolean, | ||
| fn: () => {// | ||
| } | ||
| }); // -- Result | ||
| return { | ||
| visible, | ||
| hidden, | ||
| $visible, | ||
| $hidden | ||
| }; | ||
| }; | ||
| trackPageVisibility['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| visible | ||
| } = trackPageVisibility({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: visible | ||
| }; | ||
| }; | ||
| const trackNetworkStatus = config => { | ||
| const online = setupListener({ | ||
| add: listener => window.addEventListener('online', listener), | ||
| remove: listener => window.removeEventListener('online', listener) | ||
| }, config); | ||
| const offline = setupListener({ | ||
| add: listener => window.addEventListener('offline', listener), | ||
| remove: listener => window.removeEventListener('offline', listener) | ||
| }, config); | ||
| const $online = effector.createStore(readValue(() => navigator.onLine, true), { | ||
| serialize: 'ignore' | ||
| }).on(online, () => true).on(offline, () => false); | ||
| const $offline = $online.map(online => !online); | ||
| return { | ||
| online, | ||
| offline, | ||
| $offline, | ||
| $online | ||
| }; | ||
| }; | ||
| trackNetworkStatus['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| online | ||
| } = trackNetworkStatus({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: online | ||
| }; | ||
| }; | ||
| function trackMediaQuery(mq, config) { | ||
| // single query | ||
| if (typeof mq === 'string') { | ||
| if (config) { | ||
| return tracker(mq, config); | ||
| } else { | ||
| const track = finalConfig => tracker(mq, finalConfig); | ||
| track['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| matched | ||
| } = tracker(mq, { | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: matched | ||
| }; | ||
| }; | ||
| return track; | ||
| } | ||
| } // multiple queries | ||
| else { | ||
| if (config) { | ||
| const resuls = {}; | ||
| for (const [mqKey, mqValue] of Object.entries(mq)) { | ||
| resuls[mqKey] = trackMediaQuery(mqValue, config); | ||
| } | ||
| return resuls; | ||
| } else { | ||
| const results = {}; | ||
| for (const [mqKey, mqValue] of Object.entries(mq)) { | ||
| results[mqKey] = finalConfig => trackMediaQuery(mqValue, finalConfig); | ||
| } | ||
| return results; | ||
| } | ||
| } | ||
| } | ||
| function tracker(query, config) { | ||
| var _a; | ||
| const mq = readValue(() => window.matchMedia(query), null); | ||
| const changed = setupListener({ | ||
| add: listener => mq === null || mq === void 0 ? void 0 : mq.addEventListener('change', listener), | ||
| remove: listener => mq === null || mq === void 0 ? void 0 : mq.removeEventListener('change', listener) | ||
| }, config); | ||
| const $matches = effector.createStore((_a = mq === null || mq === void 0 ? void 0 : mq.matches) !== null && _a !== void 0 ? _a : false, { | ||
| serialize: 'ignore' | ||
| }).on(changed, (_, event) => event.matches); | ||
| const matched = effector.createEvent(); | ||
| effector.sample({ | ||
| clock: [$matches.updates, config.setup], | ||
| filter: $matches, | ||
| fn: () => {// ... | ||
| }, | ||
| target: matched | ||
| }); | ||
| return { | ||
| $matches, | ||
| matched | ||
| }; | ||
| } | ||
| const $acceptLanguageHeader = effector.createStore(null, { | ||
| serialize: 'ignore' | ||
| }); | ||
| const $headerLanguages = $acceptLanguageHeader.map(header => { | ||
| if (!header) { | ||
| return []; | ||
| } | ||
| return header.split(',').map(lang => { | ||
| var _a; | ||
| return (_a = lang.split(';')[0]) === null || _a === void 0 ? void 0 : _a.trim(); | ||
| }).filter(lang => lang && lang !== '*'); | ||
| }); | ||
| const trackPreferredLanguages = config => { | ||
| const $navigatorLanguages = effector.createStore(readValue(() => navigator.languages, []), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const languagesChanged = setupListener({ | ||
| add: listener => window.addEventListener('languagechange', listener), | ||
| remove: listener => window.removeEventListener('languagechange', listener), | ||
| readPayload: () => navigator.languages | ||
| }, config); | ||
| effector.sample({ | ||
| clock: languagesChanged, | ||
| target: $navigatorLanguages | ||
| }); | ||
| const $languages = effector.combine({ | ||
| fromHeader: $headerLanguages, | ||
| fromNavigator: $navigatorLanguages | ||
| }, ({ | ||
| fromHeader, | ||
| fromNavigator | ||
| }) => fromHeader.length > 0 ? fromHeader : fromNavigator); | ||
| const $language = $languages.map(languages => { | ||
| var _a; | ||
| return (_a = languages[0]) !== null && _a !== void 0 ? _a : null; | ||
| }); | ||
| const languageChanged = effector.sample({ | ||
| clock: languagesChanged, | ||
| fn() {// noop | ||
| } | ||
| }); | ||
| return { | ||
| $languages, | ||
| $language, | ||
| languageChanged | ||
| }; | ||
| }; | ||
| trackPreferredLanguages['@@trigger'] = () => { | ||
| const setup = effector.createEvent(); | ||
| const teardown = effector.createEvent(); | ||
| const { | ||
| languageChanged | ||
| } = trackPreferredLanguages({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: languageChanged | ||
| }; | ||
| }; | ||
| trackPreferredLanguages.$acceptLanguageHeader = $acceptLanguageHeader; | ||
| exports.trackMediaQuery = trackMediaQuery; | ||
| exports.trackNetworkStatus = trackNetworkStatus; | ||
| exports.trackPageVisibility = trackPageVisibility; | ||
| exports.trackPreferredLanguages = trackPreferredLanguages; | ||
| exports.trackScreenOrientation = trackScreenOrientation; |
| export * from './index.cjs.js'; | ||
| export { _default as default } from './index.cjs.default.js'; |
-351
| import { createEvent, createStore, createEffect, scopeBind, attach, sample, combine } from 'effector'; | ||
| function readValue(getter, defaultValue) { | ||
| try { | ||
| const value = getter(); | ||
| if (value === undefined) { | ||
| return defaultValue; | ||
| } | ||
| return value; | ||
| } catch (e) { | ||
| return defaultValue; | ||
| } | ||
| } | ||
| function setupListener({ | ||
| add, | ||
| remove, | ||
| readPayload | ||
| }, config) { | ||
| const event = createEvent(); | ||
| const $subscription = createStore(null, { | ||
| serialize: 'ignore' | ||
| }); | ||
| const startWatchingFx = createEffect(() => { | ||
| const boundEvent = scopeBind(event, { | ||
| safe: true | ||
| }); | ||
| let listener = boundEvent; | ||
| if (readPayload) { | ||
| listener = () => boundEvent(readPayload()); | ||
| } | ||
| add(listener); | ||
| return listener; | ||
| }); | ||
| const stopWatchingFx = attach({ | ||
| source: $subscription, | ||
| effect(subscription) { | ||
| if (!subscription) return; | ||
| remove(subscription); | ||
| } | ||
| }); | ||
| sample({ | ||
| clock: config.setup, | ||
| target: startWatchingFx | ||
| }); | ||
| sample({ | ||
| clock: startWatchingFx.doneData, | ||
| filter: Boolean, | ||
| target: $subscription | ||
| }); | ||
| if (config.teardown) { | ||
| sample({ | ||
| clock: config.teardown, | ||
| target: stopWatchingFx | ||
| }); | ||
| } | ||
| sample({ | ||
| clock: stopWatchingFx.done, | ||
| target: $subscription.reinit | ||
| }); | ||
| return event; | ||
| } | ||
| const trackScreenOrientation = config => { | ||
| const $type = createStore(readValue(() => screen.orientation.type, null), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const $angle = createStore(readValue(() => screen.orientation.angle, null), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const orientationChanged = setupListener({ | ||
| add: listener => screen.orientation.addEventListener('change', listener), | ||
| remove: listener => screen.orientation.removeEventListener('change', listener), | ||
| readPayload: () => screen.orientation | ||
| }, config); | ||
| sample({ | ||
| clock: orientationChanged, | ||
| fn: () => screen.orientation.type, | ||
| target: $type | ||
| }); | ||
| sample({ | ||
| clock: orientationChanged, | ||
| fn: () => screen.orientation.angle, | ||
| target: $angle | ||
| }); | ||
| return { | ||
| $type, | ||
| $angle | ||
| }; | ||
| }; | ||
| trackScreenOrientation['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| $type | ||
| } = trackScreenOrientation({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| const fired = sample({ | ||
| clock: $type.updates, | ||
| fn: () => {// noop | ||
| } | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired | ||
| }; | ||
| }; | ||
| const trackPageVisibility = config => { | ||
| const visibilityChanged = setupListener({ | ||
| add: listener => document.addEventListener('visibilitychange', listener), | ||
| remove: listener => document.removeEventListener('visibilitychange', listener), | ||
| readPayload: () => document.visibilityState | ||
| }, config); | ||
| const $visibilityState = createStore(readValue(() => document.visibilityState, 'visible'), { | ||
| serialize: 'ignore' | ||
| }).on(visibilityChanged, (_, state) => state); // -- Public API | ||
| const $visible = $visibilityState.map(state => state === 'visible'); | ||
| const $hidden = $visibilityState.map(state => state === 'hidden'); | ||
| const visible = sample({ | ||
| clock: $visible.updates, | ||
| filter: Boolean, | ||
| fn: () => {// | ||
| } | ||
| }); | ||
| const hidden = sample({ | ||
| clock: $hidden.updates, | ||
| filter: Boolean, | ||
| fn: () => {// | ||
| } | ||
| }); // -- Result | ||
| return { | ||
| visible, | ||
| hidden, | ||
| $visible, | ||
| $hidden | ||
| }; | ||
| }; | ||
| trackPageVisibility['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| visible | ||
| } = trackPageVisibility({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: visible | ||
| }; | ||
| }; | ||
| const trackNetworkStatus = config => { | ||
| const online = setupListener({ | ||
| add: listener => window.addEventListener('online', listener), | ||
| remove: listener => window.removeEventListener('online', listener) | ||
| }, config); | ||
| const offline = setupListener({ | ||
| add: listener => window.addEventListener('offline', listener), | ||
| remove: listener => window.removeEventListener('offline', listener) | ||
| }, config); | ||
| const $online = createStore(readValue(() => navigator.onLine, true), { | ||
| serialize: 'ignore' | ||
| }).on(online, () => true).on(offline, () => false); | ||
| const $offline = $online.map(online => !online); | ||
| return { | ||
| online, | ||
| offline, | ||
| $offline, | ||
| $online | ||
| }; | ||
| }; | ||
| trackNetworkStatus['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| online | ||
| } = trackNetworkStatus({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: online | ||
| }; | ||
| }; | ||
| function trackMediaQuery(mq, config) { | ||
| // single query | ||
| if (typeof mq === 'string') { | ||
| if (config) { | ||
| return tracker(mq, config); | ||
| } else { | ||
| const track = finalConfig => tracker(mq, finalConfig); | ||
| track['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| matched | ||
| } = tracker(mq, { | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: matched | ||
| }; | ||
| }; | ||
| return track; | ||
| } | ||
| } // multiple queries | ||
| else { | ||
| if (config) { | ||
| const resuls = {}; | ||
| for (const [mqKey, mqValue] of Object.entries(mq)) { | ||
| resuls[mqKey] = trackMediaQuery(mqValue, config); | ||
| } | ||
| return resuls; | ||
| } else { | ||
| const results = {}; | ||
| for (const [mqKey, mqValue] of Object.entries(mq)) { | ||
| results[mqKey] = finalConfig => trackMediaQuery(mqValue, finalConfig); | ||
| } | ||
| return results; | ||
| } | ||
| } | ||
| } | ||
| function tracker(query, config) { | ||
| var _mq$matches; | ||
| const mq = readValue(() => window.matchMedia(query), null); | ||
| const changed = setupListener({ | ||
| add: listener => mq == null ? void 0 : mq.addEventListener('change', listener), | ||
| remove: listener => mq == null ? void 0 : mq.removeEventListener('change', listener) | ||
| }, config); | ||
| const $matches = createStore((_mq$matches = mq == null ? void 0 : mq.matches) != null ? _mq$matches : false, { | ||
| serialize: 'ignore' | ||
| }).on(changed, (_, event) => event.matches); | ||
| const matched = createEvent(); | ||
| sample({ | ||
| clock: [$matches.updates, config.setup], | ||
| filter: $matches, | ||
| fn: () => {// ... | ||
| }, | ||
| target: matched | ||
| }); | ||
| return { | ||
| $matches, | ||
| matched | ||
| }; | ||
| } | ||
| const $acceptLanguageHeader = createStore(null, { | ||
| serialize: 'ignore' | ||
| }); | ||
| const $headerLanguages = $acceptLanguageHeader.map(header => { | ||
| if (!header) { | ||
| return []; | ||
| } | ||
| return header.split(',').map(lang => { | ||
| var _lang$split$; | ||
| return (_lang$split$ = lang.split(';')[0]) == null ? void 0 : _lang$split$.trim(); | ||
| }).filter(lang => lang && lang !== '*'); | ||
| }); | ||
| const trackPreferredLanguages = config => { | ||
| const $navigatorLanguages = createStore(readValue(() => navigator.languages, []), { | ||
| serialize: 'ignore' | ||
| }); | ||
| const languagesChanged = setupListener({ | ||
| add: listener => window.addEventListener('languagechange', listener), | ||
| remove: listener => window.removeEventListener('languagechange', listener), | ||
| readPayload: () => navigator.languages | ||
| }, config); | ||
| sample({ | ||
| clock: languagesChanged, | ||
| target: $navigatorLanguages | ||
| }); | ||
| const $languages = combine({ | ||
| fromHeader: $headerLanguages, | ||
| fromNavigator: $navigatorLanguages | ||
| }, ({ | ||
| fromHeader, | ||
| fromNavigator | ||
| }) => fromHeader.length > 0 ? fromHeader : fromNavigator); | ||
| const $language = $languages.map(languages => { | ||
| var _languages$; | ||
| return (_languages$ = languages[0]) != null ? _languages$ : null; | ||
| }); | ||
| const languageChanged = sample({ | ||
| clock: languagesChanged, | ||
| fn() {// noop | ||
| } | ||
| }); | ||
| return { | ||
| $languages, | ||
| $language, | ||
| languageChanged | ||
| }; | ||
| }; | ||
| trackPreferredLanguages['@@trigger'] = () => { | ||
| const setup = createEvent(); | ||
| const teardown = createEvent(); | ||
| const { | ||
| languageChanged | ||
| } = trackPreferredLanguages({ | ||
| setup, | ||
| teardown | ||
| }); | ||
| return { | ||
| setup, | ||
| teardown, | ||
| fired: languageChanged | ||
| }; | ||
| }; | ||
| trackPreferredLanguages.$acceptLanguageHeader = $acceptLanguageHeader; | ||
| export { trackMediaQuery, trackNetworkStatus, trackPageVisibility, trackPreferredLanguages, trackScreenOrientation }; |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Yes
NaN19253
-0.93%5
-37.5%692
-0.29%