<template>
<div>
<b-form @submit="onSubmit" class="d-flex justify-content-center mt-5">
<b-form-group id="input-group-1" label-for="input-1">
<b-input-group>
<VuePhoneNumberInput
v-model="inputNumberVal"
:disabled="loading"
@update="updateInputNumber"
/>
<b-button
size="sm"
variant="dark"
v-on:click="runScans"
:disabled="loading"
class="mr-2 ml-2"
>
<b-icon-play-fill></b-icon-play-fill>
Lookup
</b-button>
<b-button
variant="danger"
size="sm"
v-on:click="clearData"
v-show="number"
:disabled="loading"
>Reset
</b-button>
</b-input-group>
</b-form-group>
</b-form>
<b-card
v-if="isLookup || showInformations"
header="Informations"
class="mb-3 mt-3 text-center"
>
<b-list-group flush>
<b-list-group-item
v-for="(value, name) in localData"
:key="name"
class="text-left d-flex"
>
<h5 class="text-capitalize m-0 mr-4">{{ formatString(name) }}:</h5>
<p class="m-0">{{ value }}</p>
</b-list-group-item>
</b-list-group>
</b-card>
<b-card v-if="isLookup" header="Scanners" class="text-center">
<Scanner
v-for="(scanner, index) in scanners"
:key="index"
:name="scanner.name.charAt(0).toUpperCase() + scanner.name.slice(1)"
:scanId="scanner.name"
/>
</b-card>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import { mapMutations, mapState } from "vuex";
import { formatNumber, isValid, formatString, getScanners } from "../utils";
import VuePhoneNumberInput from "vue-phone-number-input";
import Scanner from "../components/Scanner.vue";
import axios, { AxiosResponse } from "axios";
import config from "@/config";
interface InputNumberObject {
countryCallingCode: string;
countryCode: string;
e164: string;
formatInternational: string;
formatNational: string;
formattedNumber: string;
isValid: boolean;
nationalNumber: string;
phoneNumber: string;
type: string;
uri: string;
}
interface ScannerObject {
name: string;
description: string;
}
interface Data {
loading: boolean;
isLookup: boolean;
showInformations: boolean;
inputNumber: string;
inputNumberVal: string;
scanEvent: Vue;
scanners: ScannerObject[];
localData: {
valid: boolean;
raw_local: string;
local: string;
e164: string;
international: string;
countryCode: number;
country: string;
carrier: string;
};
}
export type ScanResponse<T> = AxiosResponse<{
success: boolean;
result: T;
error: string;
}>;
export default Vue.extend({
components: { Scanner, VuePhoneNumberInput },
computed: {
...mapState(["number"]),
...mapMutations(["pushError"]),
},
data(): Data {
return {
loading: false,
isLookup: false,
showInformations: false,
inputNumber: "",
inputNumberVal: "",
scanEvent: new Vue(),
scanners: [],
localData: {
valid: false,
raw_local: "",
local: "",
e164: "",
international: "",
countryCode: 33,
country: "",
carrier: "",
},
};
},
methods: {
formatString: formatString,
clearData() {
this.isLookup = false;
this.showInformations = false;
this.$store.commit("resetState");
},
async runScans(): Promise<void> {
this.clearData();
if (!isValid(this.inputNumber)) {
this.$store.commit("pushError", { message: "Number is not valid." });
return;
}
this.loading = true;
this.$store.commit("setNumber", formatNumber(this.inputNumber));
try {
const res = await axios.post(`${config.apiUrl}/v2/numbers`, {
number: this.$store.state.number,
});
this.localData = res.data;
if (this.localData.valid) {
this.getScanners();
this.isLookup = true;
} else {
this.showInformations = true;
}
} catch (error) {
this.$store.commit("pushError", { message: error });
}
this.loading = false;
},
onSubmit(evt: Event) {
evt.preventDefault();
},
updateInputNumber(val: InputNumberObject) {
this.inputNumber = val.e164;
},
async getScanners() {
try {
this.scanners = await getScanners();
} catch (error) {
this.$store.commit("pushError", { message: error });
}
},
},
});
</script>
<style src="vue-phone-number-input/dist/vue-phone-number-input.css"></style>