diff --git a/next.config.js b/next.config.js index e2c68f5b..63d0bc83 100644 --- a/next.config.js +++ b/next.config.js @@ -3,7 +3,7 @@ const { i18n } = require('./next-i18next.config'); const { cronJob } = require('./src/services/crons'); const { queueReceiver } = require('./src/services/queue'); const { PHASE_DEVELOPMENT_SERVER, PHASE_PRODUCTION_SERVER } = require('next/constants'); -const isLocal = process.env.NEXT_PUBLIC_BUILD_ENV === 'local'; +const isProduction = process.env.NEXT_PUBLIC_BUILD_ENV === 'production'; const nextConfig = { reactStrictMode: true, @@ -15,7 +15,7 @@ module.exports = async (phase, { defaultConfig }) => { console.log('Quickshare is starting...'); let shouldRunQueue = phase === PHASE_DEVELOPMENT_SERVER || phase === PHASE_PRODUCTION_SERVER; - if (!isLocal) shouldRunQueue = false; + if (isProduction) shouldRunQueue = false; if (process.env.NEXT_PUBLIC_SHORT_DOMAIN === 'true') shouldRunQueue = false; if (shouldRunQueue) { queueReceiver(); diff --git a/public/locales/en/common.json b/public/locales/en/common.json index b55de87b..f6412e4d 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -116,5 +116,8 @@ "p2-head": "Shortening, tracking and sharing" }, "signInLink": "Or click here to continue.", - "usePasswordToShortenedLink": "Also use this password for shortened URL" + "usePasswordToShortenedLink": "Also use this password for shortened URL", + "clicks": "Clicks", + "clicksByCountry": "Clicks by Country", + "otherCountry": "Others" } diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 5d0064d9..dcfc4b2a 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -117,5 +117,8 @@ "card3-content": "Tous les accès aux liens raccourcis, y compris les bots et les utilisateurs, sont enregistrés. Les détails de suivi incluent la chaîne complète de l'agent utilisateur, l'adresse IP et les informations sur l'appareil." }, "signInLink": "Ou cliquez ici pour continuer.", - "usePasswordToShortenedLink": "Utilisez également ce mot de passe pour l'URL raccourcie" + "usePasswordToShortenedLink": "Utilisez également ce mot de passe pour l'URL raccourcie", + "clicks": "Clics", + "clicksByCountry": "Clics par pays", + "otherCountry": "Autres" } diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 4bd4dc90..5c36a292 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -114,8 +114,11 @@ "card2": "आपका डेटा सुरक्षित है", "card2-content": "आपके मूल लिंक क्विकशेयर के माध्यम से एनोनाइमाइज़ किए जाते हैं। शॉर्ट URL सर्च इंजन परिणामों में नहीं दिखाई देंगे। आप लिंक ट्रैकिंग सेक्शन में अपने शॉर्ट URL को पासवर्ड प्रोटेक्ट भी कर सकते हैं।", "card3": "लिंक ट्रैकिंग पारदर्शी है", - "card3-content": "बॉट्स और यूज़र्स सहित शॉर्ट URL तक सभी एक्सेस रिकॉर्ड किए जाते हैं। ट्रैकिंग डिटेल में पूरा यूज़र एजेंट स्ट्रिंग, आईपी एड्रेस और डिवाइस की जानकारी शामिल होती है।", - "signInLink": "या जारी रखने के लिए यहां क्लिक करें।", - "usePasswordToShortenedLink": "इस पासवर्ड का उपयोग शॉर्ट URL के लिए भी करें" - } + "card3-content": "बॉट्स और यूज़र्स सहित शॉर्ट URL तक सभी एक्सेस रिकॉर्ड किए जाते हैं। ट्रैकिंग डिटेल में पूरा यूज़र एजेंट स्ट्रिंग, आईपी एड्रेस और डिवाइस की जानकारी शामिल होती है।" + }, + "signInLink": "या जारी रखने के लिए यहां क्लिक करें।", + "usePasswordToShortenedLink": "इस पासवर्ड का उपयोग शॉर्ट URL के लिए भी करें", + "clicks": "क्लिक्स", + "clicksByCountry": "देश के हिसाब से क्लिक्स", + "otherCountry": "अन्य" } diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index ac7b1198..8406e088 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -117,5 +117,8 @@ "card3-content": "ボットやユーザーを含む、短縮URLへの全アクセスが記録されます。トラッキング情報にはユーザーエージェント文字列、IPアドレス、デバイス情報が全て含まれます。" }, "signInLink": "またはここをクリックして続行。", - "usePasswordToShortenedLink": "このパスワードを短縮URLにも使用する" + "usePasswordToShortenedLink": "このパスワードを短縮URLにも使用する", + "clicks": "クリック数", + "clicksByCountry": "国別クリック数", + "otherCountry": "その他" } diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index bf275691..9672be7b 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -117,5 +117,8 @@ "card3-content": "Tất cả truy cập vào link rút gọn, kể cả bot hay người dùng đều được ghi lại. Thông tin theo dõi bao gồm đầy đủ User Agent, địa chỉ IP và thông tin thiết bị." }, "signInLink": "Hoặc bạn có thể click vào đây để tiếp tục.", - "usePasswordToShortenedLink": "Áp dụng mật khẩu cho link rút gọn" + "usePasswordToShortenedLink": "Áp dụng mật khẩu cho link rút gọn", + "clicks": "Clicks", + "clicksByCountry": "Clicks theo quốc gia", + "otherCountry": "Khác" } diff --git a/public/locales/zh/common.json b/public/locales/zh/common.json index 2e70dcb7..a710a1a7 100644 --- a/public/locales/zh/common.json +++ b/public/locales/zh/common.json @@ -117,5 +117,8 @@ "card3-content": "所有对缩短链接的访问,包括机器人和用户,都会被记录。跟踪信息包括完整的用户代理字符串、IP 地址和设备信息。" }, "signInLink": "或者点击这里继续。", - "usePasswordToShortenedLink": "也为缩短网址使用这个密码" + "usePasswordToShortenedLink": "也为缩短网址使用这个密码", + "clicks": "点击次数", + "clicksByCountry": "各国点击量", + "otherCountry": "其他" } diff --git a/src/components/atoms/BarChart.tsx b/src/components/atoms/BarChart.tsx new file mode 100644 index 00000000..9a9d90d4 --- /dev/null +++ b/src/components/atoms/BarChart.tsx @@ -0,0 +1,62 @@ +import Script from 'next/script'; +import { useEffect, useState } from 'react'; +import { Window } from 'types/constants'; + +interface Props { + label: any[]; + value: (string | number | null)[][]; + title?: string; + className?: string; +} + +export const BarChart = (props: Props) => { + const { className, title, label, value } = props; + const [loaded, setLoaded] = useState(false); + const google = Window().google; + + useEffect(() => { + if (!google) return; + + google.charts.load('current', { packages: ['corechart', 'bar'] }); + google.charts.setOnLoadCallback(drawBasic); + + function drawBasic() { + var data = google.visualization.arrayToDataTable([label, ...value]); + + var options = { + title, + backgroundColor: '#fcfcfd', + hAxis: { + minValue: 0, + }, + fontName: 'Roboto Slab', + fontSize: 12, + legend: 'none', + }; + + var chart = new google.visualization.BarChart(document.getElementById('bar-div')); + + chart.draw(data, options); + + return () => { + chart.clearChart(); + }; + } + }, [loaded, google]); + + if (value.length === 0) return null; + + return ( + <> +