Implement `getRegionData` in web (#2743)
* Implement `getRegionData` in web - Adjust __dirname to be a more sensible value - Add `process.env.GEOLOCATION_NAMES` for web builds to avoid having to blindly try and fetch * Reverting webpack changes * Change `indexOf` to `includes` Co-authored-by: absidue <48293849+absidue@users.noreply.github.com> * Adding a new helper `createWebURL` It takes a given path to a resource, and it returns an easily fetch-able absolute path * Using `createWebUrl` inside of the locale fetch * Using `createWebURL` inside of `getRegionData` * Removing an unnecessary leftover import * Wait, no I was mistaken Co-authored-by: absidue <48293849+absidue@users.noreply.github.com>
This commit is contained in:
parent
a97869ff32
commit
6e693c6c37
|
@ -1,4 +1,5 @@
|
|||
const path = require('path')
|
||||
const fs = require('fs')
|
||||
const webpack = require('webpack')
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
const VueLoaderPlugin = require('vue-loader/lib/plugin')
|
||||
|
@ -169,7 +170,8 @@ const processLocalesPlugin = new ProcessLocalesPlugin({
|
|||
config.plugins.push(
|
||||
processLocalesPlugin,
|
||||
new webpack.DefinePlugin({
|
||||
'process.env.LOCALE_NAMES': JSON.stringify(processLocalesPlugin.localeNames)
|
||||
'process.env.LOCALE_NAMES': JSON.stringify(processLocalesPlugin.localeNames),
|
||||
'process.env.GEOLOCATION_NAMES': JSON.stringify(fs.readdirSync(path.join(__dirname, '..', 'static', 'geolocations')))
|
||||
}),
|
||||
new CopyWebpackPlugin({
|
||||
patterns: [
|
||||
|
|
|
@ -245,3 +245,28 @@ export function openExternalLink(url) {
|
|||
window.open(url, '_blank')
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This creates an absolute web url from a given path.
|
||||
* It will assume all given paths are relative to the current window location.
|
||||
* @param {string} path relative path to resource
|
||||
* @returns {string} absolute web path
|
||||
*/
|
||||
export function createWebURL(path) {
|
||||
const url = new URL(window.location.href)
|
||||
const { origin } = url
|
||||
let windowPath = url.pathname
|
||||
// Remove the html file name from the path
|
||||
if (windowPath.endsWith('.html')) {
|
||||
windowPath = windowPath.replace(/[^./]*\.html$/, '')
|
||||
}
|
||||
// Remove proceeding slash in given path if there is one
|
||||
if (path.startsWith('/')) {
|
||||
path = path.substring(1, path.length)
|
||||
}
|
||||
// Remove trailing slash if there is one
|
||||
if (windowPath.endsWith('/')) {
|
||||
windowPath = windowPath.substring(0, windowPath.length - 1)
|
||||
}
|
||||
return `${origin}${windowPath}/${path}`
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import Vue from 'vue'
|
||||
import VueI18n from 'vue-i18n'
|
||||
import fs from 'fs'
|
||||
|
||||
import { createWebURL } from '../helpers/utils'
|
||||
// List of locales approved for use
|
||||
import activeLocales from '../../../static/locales/activeLocales.json'
|
||||
|
||||
|
@ -54,17 +54,7 @@ class CustomVueI18n extends VueI18n {
|
|||
console.error(locale, err)
|
||||
}
|
||||
} else {
|
||||
const url = new URL(window.location.href)
|
||||
url.hash = ''
|
||||
if (url.pathname.endsWith('index.html')) {
|
||||
url.pathname = url.pathname.replace(/index\.html$/, '')
|
||||
}
|
||||
|
||||
if (url.pathname) {
|
||||
url.pathname += `${!url.pathname.endsWith('/') ? '/' : ''}static/locales/${locale}.json`
|
||||
} else {
|
||||
url.pathname = `/static/locales/${locale}.json`
|
||||
}
|
||||
const url = createWebURL(`/static/locales/${locale}.json`)
|
||||
|
||||
const response = await fetch(url)
|
||||
const data = await response.json()
|
||||
|
|
|
@ -323,7 +323,7 @@ const stateWithSideEffects = {
|
|||
}
|
||||
|
||||
i18n.locale = targetLocale
|
||||
dispatch('getRegionData', {
|
||||
await dispatch('getRegionData', {
|
||||
locale: targetLocale
|
||||
})
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import path from 'path'
|
|||
import i18n from '../../i18n/index'
|
||||
|
||||
import { IpcChannels } from '../../../constants'
|
||||
import { openExternalLink, showToast } from '../../helpers/utils'
|
||||
import { createWebURL, openExternalLink, showToast } from '../../helpers/utils'
|
||||
|
||||
const state = {
|
||||
isSideNavOpen: false,
|
||||
|
@ -437,16 +437,19 @@ const actions = {
|
|||
commit('setShowProgressBar', value)
|
||||
},
|
||||
|
||||
getRegionData ({ commit }, payload) {
|
||||
let fileData
|
||||
/* eslint-disable-next-line */
|
||||
const fileLocation = process.env.NODE_ENV === 'development' ? './static/geolocations/' : `${__dirname}/static/geolocations/`
|
||||
if (fs.existsSync(`${fileLocation}${payload.locale}`)) {
|
||||
fileData = fs.readFileSync(`${fileLocation}${payload.locale}/countries.json`)
|
||||
async getRegionData ({ commit }, { locale }) {
|
||||
let localePathExists
|
||||
// Exclude __dirname from path if not in electron
|
||||
const fileLocation = `${process.env.IS_ELECTRON ? process.env.NODE_ENV === 'development' ? '.' : __dirname : ''}/static/geolocations/`
|
||||
if (process.env.IS_ELECTRON) {
|
||||
localePathExists = fs.existsSync(`${fileLocation}${locale}`)
|
||||
} else {
|
||||
fileData = fs.readFileSync(`${fileLocation}en-US/countries.json`)
|
||||
localePathExists = process.env.GEOLOCATION_NAMES.includes(locale)
|
||||
}
|
||||
const countries = JSON.parse(fileData).map((entry) => { return { id: entry.id, name: entry.name, code: entry.alpha2 } })
|
||||
const pathName = `${fileLocation}${localePathExists ? locale : 'en-US'}/countries.json`
|
||||
const fileData = process.env.IS_ELECTRON ? JSON.parse(fs.readFileSync(pathName)) : await (await fetch(createWebURL(pathName))).json()
|
||||
|
||||
const countries = fileData.map((entry) => { return { id: entry.id, name: entry.name, code: entry.alpha2 } })
|
||||
countries.sort((a, b) => { return a.id - b.id })
|
||||
|
||||
const regionNames = countries.map((entry) => { return entry.name })
|
||||
|
|
Loading…
Reference in New Issue