🚨 Active Supply Chain Attack:node-ipc Package Compromised.Learn More
Socket
Book a DemoSign in
Socket

@withease/web-api

Package Overview
Dependencies
Maintainers
1
Versions
21
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@withease/web-api - npm Package Compare versions

Comparing version
1.0.0
to
1.0.1
+359
index.cjs
'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;
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;
'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';
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 };