application-amicale/src/utils/URLHandler.js

109 lines
3.3 KiB
JavaScript

// @flow
import {Linking} from 'react-native';
export default class URLHandler {
static SCHEME = "campus-insat://";
static CLUB_INFO_URL_PATH = "club";
static EVENT_INFO_URL_PATH = "event";
static CLUB_INFO_ROUTE = "club-information";
static EVENT_INFO_ROUTE = "planning-information";
onInitialURLParsed: Function;
onDetectURL: Function;
constructor(onInitialURLParsed: Function, onDetectURL: Function) {
this.onInitialURLParsed = onInitialURLParsed;
this.onDetectURL = onDetectURL;
}
listen() {
Linking.addEventListener('url', this.onUrl);
Linking.getInitialURL().then(this.onInitialUrl);
}
onUrl = ({url}: { url: string }) => {
if (url != null) {
let data = URLHandler.getUrlData(URLHandler.parseUrl(url));
if (data !== null)
this.onDetectURL(data);
}
};
onInitialUrl = (url: ?string) => {
if (url != null) {
let data = URLHandler.getUrlData(URLHandler.parseUrl(url));
if (data !== null)
this.onInitialURLParsed(data);
}
};
static parseUrl(url: string) {
let params = {};
let path = "";
let temp = url.replace(URLHandler.SCHEME, "");
if (temp != null) {
let array = temp.split("?");
if (array != null && array.length > 0) {
path = array[0];
}
if (array != null && array.length > 1) {
let tempParams = array[1].split("&");
for (let i = 0; i < tempParams.length; i++) {
let paramsArray = tempParams[i].split("=");
if (paramsArray.length > 1) {
params[paramsArray[0]] = paramsArray[1];
}
}
}
}
return {path: path, queryParams: params};
}
static getUrlData({path, queryParams}: Object) {
let data = null;
if (path !== null) {
if (URLHandler.isClubInformationLink(path))
data = URLHandler.generateClubInformationData(queryParams);
else if (URLHandler.isPlanningInformationLink(path))
data = URLHandler.generatePlanningInformationData(queryParams);
}
return data;
}
static isUrlValid(url: string) {
return this.getUrlData(URLHandler.parseUrl(url)) !== null;
}
static isClubInformationLink(path: string) {
return path === URLHandler.CLUB_INFO_URL_PATH;
}
static isPlanningInformationLink(path: string) {
return path === URLHandler.EVENT_INFO_URL_PATH;
}
static generateClubInformationData(params: Object): Object | null {
if (params !== undefined && params.id !== undefined) {
let id = parseInt(params.id);
if (!isNaN(id)) {
return {route: URLHandler.CLUB_INFO_ROUTE, data: {clubId: id}};
}
}
return null;
}
static generatePlanningInformationData(params: Object): Object | null {
if (params !== undefined && params.id !== undefined) {
let id = parseInt(params.id);
if (!isNaN(id)) {
return {route: URLHandler.EVENT_INFO_ROUTE, data: {eventId: id}};
}
}
return null;
}
}