Mobile-Detect | lightweight PHP class for detecting mobile devices | Computer Vision library
kandi X-RAY | Mobile-Detect Summary
Support
Quality
Security
License
Reuse
- Determine if the device is mobile .
- Returns the version of the user agent .
- Determine if the browser is mobile .
- Set User - Agent
- Check the HTTP headers for a mobile header
- Sets the cloudfront headers
- Set HTTP headers .
- Determine if the user agent is a tablet .
- Match a key against the cache key
- Get an HTTP header
Mobile-Detect Key Features
Mobile-Detect Examples and Code Snippets
Trending Discussions on Mobile-Detect
Trending Discussions on Mobile-Detect
QUESTION
I am trying to test an axios request, and I need to use an auth token in order to access the endpoint, however my test fails because I am getting "Bearer null" and inputting this into my headers.Authorization. Here is my actual code below
File I'm testing:
this.$axios.get(url, { headers: { Authorization: `Bearer ${localStorage.getItem("access-token")}` } })
.then((response) => {
this.loading = true;
// Get latest barcode created and default it to our "from" input
this.barcodeFrom = response.data.data[response.data.data.length - 1]['i_end_uid'] + 1;
this.barcodeTo = this.barcodeFrom + 1;
this.barcodeRanges = response.data.data;
// Here we add to the data array to make printed barcodes more obvious for the user
this.barcodeRanges.map(item => item['range'] = `${item['i_start_uid']} - ${item['i_end_uid']}`);
// Make newest barcodes appear at the top
this.barcodeRanges.sort((a, b) => new Date(b['created_at']) - new Date(a['created_at']));
})
.catch((error) => {
console.log('Barcode retrieval error:', error);
this.barcodeFrom === 0 ? null : this.snackbarError = true;
})
.finally(() => {
// Edge case when there's no barcode records
this.barcodeFrom === 0 ? this.barcodeTo = 1 : null;
this.loading = false
});
console.log('bcr', this.barcodeRanges);
Test file:
import Vuetify from "vuetify";
import Vuex from "vuex";
import { createLocalVue, shallowMount } from "@vue/test-utils";
import VueMobileDetection from "vue-mobile-detection";
import axios from 'axios';
import index from "@/pages/barcode_logs/index";
describe('/pages/barcode_logs/index.vue', () => {
// Initialize our 3rd party stuff
const localVue = createLocalVue();
localVue.use(Vuetify);
localVue.use(Vuex);
localVue.use(axios);
localVue.use(VueMobileDetection);
// Initialize store
let store;
// Create store
store = new Vuex.Store({
modules: {
core: {
state: {
labgroup:{
current: {
id: 1
}
}
}
}
}
});
// Set-up wrapper options
const wrapperOptions = {
localVue,
store,
mocks: {
$axios: {
get: jest.fn(() => Promise.resolve({ data: {} }))
}
}
};
// Prep spies for our component methods we want to validate
const spycreateBarcodes = jest.spyOn(index.methods, 'createBarcodes');
const createdHook = jest.spyOn(index, 'created');
// Mount the component we're testing
const wrapper = shallowMount(index, wrapperOptions);
test('if barcode logs were retrieved', () => {
expect(createdHook).toHaveBeenCalled();
expect(wrapper.vm.barcodeRanges).toHaveLength(11);
});
});
How do I mock or get the actual auth token in to work in my test?
ANSWER
Answered 2021-May-25 at 12:25You can try to mock localStorage
before creating instance of a wrapper like this:
global.localStorage = {
state: {
'access-token': 'superHashedString'
},
setItem (key, item) {
this.state[key] = item
},
getItem (key) {
return this.state[key]
}
}
You can also spy on localStorage
functions to check what arguments they were called with:
jest.spyOn(global.localStorage, 'setItem')
jest.spyOn(global.localStorage, 'getItem')
OR
You can delete localVue.use(axios)
to let your $axios
mock work correctly.
This
mocks: {
$axios: {
get: jest.fn(() => Promise.resolve({ data: {} }))
}
}
is not working because of that
localVue.use(axios)
QUESTION
I have a React app created with CRA, it compiles and runs fine. But production build made with yarn buld
and served with serve -s build
shows following error in console:
Uncaught TypeError: Cannot read property 'a' of undefined
at Object.M (main.a6de4952.chunk.js:1)
at w (main.a6de4952.chunk.js:1)
at 7.f8bc878d.chunk.js:2
at Array.forEach ()
at 7.f8bc878d.chunk.js:2
at c (7.f8bc878d.chunk.js:2)
at Object.370 (main.a6de4952.chunk.js:1)
at f ((index):1)
at Object.152 (main.a6de4952.chunk.js:1)
at f ((index):1)
I enabled generating source maps and debugged the problem. It crashes in this reducer when initializing redux reducers:
import * as Actions from '../actions';
const initialState = {
tableRef: undefined,
};
const roadmapReducer = function(state = initialState, action) {
switch ( action.type ) {
case Actions.SET_ROADMAP_TABLE_REF:
{
return {
...state,
tableRef: action.tableRef,
};
}
default:
{
return state;
}
}
};
export default roadmapReducer;
on this line
case Actions.SET_ROADMAP_TABLE_REF:
Relevant roadmap.actions.js
(other actions are omitted for clarity):
import axios from 'axios-instance';
import * as Actions from 'app/store/actions';
export const SET_ROADMAP_TABLE_REF = '[ROADMAP APP] SET ROADMAP TABLE REF';
export const SET_ROADMAP_BADGE = '[ROADMAP APP] SET ROADMAP BADGE';
export const REFRESH_ROADMAP_TABLE = '[ROADMAP APP] REFRESH ROADMAP TABLE';
export const VOTE_FEATURE = '[ROADMAP APP] VOTE FEATURE';
export function setRoadmapTableRef(tableRef) {
return {
type: SET_ROADMAP_TABLE_REF,
tableRef
};
}
...
Again, the project runs successfully without building. Major changes since the last release are adding Typescript (though I migrated only a handful of files and actions/reducers are untouched) and switching to Yarn 2. I tried to build with npm without any success.
Here's my package.json:
{
"name": "web",
"version": "1.1.4",
"private": true,
"dependencies": {
"@babel/core": "7.12.10",
"@babel/node": "7.12.10",
"@babel/preset-env": "7.11.0",
"@date-io/core": "^1.3.13",
"@date-io/date-fns": "^1.3.13",
"@material-ui/core": "4.11.0",
"@material-ui/icons": "4.9.1",
"@material-ui/lab": "^4.0.0-alpha.56",
"@material-ui/pickers": "^3.2.10",
"@types/react": "^17.0.0",
"@types/react-redux": "7.1.12",
"autosuggest-highlight": "^3.1.1",
"axios": "^0.21.0",
"classnames": "^2.2.6",
"clsx": "^1.1.1",
"cross-env": "^7.0.3",
"cross-fetch": "^3.0.6",
"d3": "^6.3.1",
"d3-svg-legend": "^2.25.6",
"date-fns": "^2.16.1",
"debounce": "^1.2.0",
"downshift": "^4.1.0",
"fast-deep-equal": "^2.0.1",
"filefy": "^0.1.10",
"firebase": "^7.11.0",
"formsy-react": "^2.2.1",
"github-markdown-css": "^4.0.0",
"history": "^4.10.1",
"i18next": "^19.8.4",
"isomorphic-fetch": "^2.2.1",
"jspdf": "^2.2.0",
"jspdf-autotable": "^3.5.13",
"jss": "^10.5.0",
"jss-plugin-extend": "^10.5.0",
"jss-rtl": "^0.3.0",
"keycode": "^2.2.0",
"localforage": "^1.9.0",
"lodash": "^4.17.20",
"material-ui-popup-state": "^1.7.1",
"mobile-detect": "^1.4.4",
"notistack": "^0.9.9",
"numeral": "^2.0.6",
"path-to-regexp": "^3.2.0",
"perfect-scrollbar": "^1.5.0",
"prismjs": "^1.22.0",
"promise": "^8.1.0",
"prop-types": "^15.7.2",
"purgecss": "^1.4.2",
"qs": "^6.9.4",
"raw-loader": "^4.0.2",
"react": "^16.13.0",
"react-app-polyfill": "^1.0.6",
"react-autosuggest": "^9.4.3",
"react-beautiful-dnd": "^13.0.0",
"react-confirm-alert": "^2.6.2",
"react-cookie-consent": "^5.1.2",
"react-dom": "^16.13.0",
"react-double-scrollbar": "^0.0.15",
"react-draggable": "^4.4.3",
"react-frame-component": "^4.1.3",
"react-i18next": "^11.8.4",
"react-markdown": "^4.3.1",
"react-masonry-css": "^1.0.14",
"react-number-format": "^4.4.1",
"react-popper": "^1.3.7",
"react-redux": "^7.2.2",
"react-router": "^5.2.0",
"react-router-config": "^5.1.1",
"react-router-dom": "^5.2.0",
"react-scripts": "^3.4.4",
"react-select": "^3.1.1",
"react-social-login-buttons": "^3.1.0",
"react-spring": "^8.0.27",
"react-swipeable-views": "^0.13.9",
"react-swipeable-views-utils": "^0.14.0-alpha.0",
"react-text-loop": "^2.3.0",
"react-text-mask": "^5.4.3",
"react-virtualized": "^9.22.3",
"react-window": "^1.8.6",
"redux": "4.0.5",
"redux-thunk": "2.3.0",
"styled-components": "^5.2.1",
"tailwindcss": "^1.2.0",
"tailwindcss-dir": "^4.0.0",
"typeface-muli": "^1.1.13",
"typescript": "^4.1.3",
"velocity-animate": "^1.5.2",
"velocity-react": "^1.4.3"
},
"devDependencies": {
"@yarnpkg/pnpify": "^2.0.0-rc.18",
"babel-eslint": "^10.1.0",
"eslint": "^6.8.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-config-prettier": "^6.10.0",
"eslint-import-resolver-node": "^0.3.4",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^3.3.0",
"eslint-plugin-react": "^7.21.5",
"eslint-plugin-react-hooks": "^4.2.0",
"js-beautify": "^1.13.0",
"prettier": "^1.19.1",
"source-map-explorer": "^2.3.1"
},
"scripts": {
"start": "yarn run tailwind && react-scripts start",
"build": "yarn run tailwind && yarn run purge-tailwind && cross-env GENERATE_SOURCEMAP=true react-scripts --max_old_space_size=1024 build",
"madge": "madge --image ./madge-graph.svg --extensions js,jsx,ts,tsx --circular .",
"tailwind": "tailwind build ./src/styles/tailwind-config.css -c ./tailwind.config.js -o ./src/styles/tailwind.css",
"purge-tailwind": "node ./purge-tailwindcss.js",
"test": "react-scripts test --env=node",
"analyze": "yarn run tailwind && yarn run purge-tailwind && react-scripts build && source-map-explorer 'build/static/js/*.js' --html analyze-result.html",
"pnpify-sdk": "yarn pnpify --sdk"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version",
"ie 11"
]
}
}
Could anybody even just point in the direction where to look for the problem, please?
ANSWER
Answered 2020-Dec-24 at 14:26After long hours of trial I finally made it work with this trick:
Replaced import statement from
import * as Actions from 'app/store/actions';
to
import * as Actions from 'app/store/actions/roadmap.actions';
I guess the problem is a rare bug in react-scripts
that tries to access imported constant before it's actually imported
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
Vulnerabilities
No vulnerabilities reported
Install Mobile-Detect
PHP requires the Visual C runtime (CRT). The Microsoft Visual C++ Redistributable for Visual Studio 2019 is suitable for all these PHP versions, see visualstudio.microsoft.com. You MUST download the x86 CRT for PHP x86 builds and the x64 CRT for PHP x64 builds. The CRT installer supports the /quiet and /norestart command-line switches, so you can also script it.
Support
Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items
Find more librariesExplore Kits - Develop, implement, customize Projects, Custom Functions and Applications with kandi kits
Save this library and start creating your kit
Share this Page