Skip to content

Commit 2ae8640

Browse files
authored
Merge pull request #23 from HellBus1/staging
v1.3.6
2 parents d46b939 + fa0cee5 commit 2ae8640

File tree

23 files changed

+258
-196
lines changed

23 files changed

+258
-196
lines changed

index.html

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,96 @@
11
<!doctype html>
2-
<html lang="en">
2+
<html lang="id">
33
<head>
44
<meta charset="UTF-8" />
55
<link rel="icon" type="image/svg+xml" href="/assets/web_icon.svg" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77

88
<!-- SEO Improvements -->
9-
<title>InvestCount | Bank Interest Calculator</title>
10-
<meta name="description" content="InvestCount is a free online tool to calculate your bank deposit interest based on your capital and bank selection. Compare rates, maximize your savings, and plan your financial growth easily." />
11-
<meta name="keywords" content="bank interest calculator, deposit calculator, savings calculator, compare bank rates, financial planning, capital growth, Indonesia, InvestCount" />
9+
<title>InvestCount | Kalkulator Deposito Bank Indonesia</title>
10+
<meta name="description" content="Hitung bunga deposito dan estimasi keuntungan bersih (setelah pajak) dari berbagai bank di Indonesia. Bandingkan tenor, suku bunga, dan ARO. Gratis & cepat." />
1211
<meta name="author" content="Syubban Fakhriya" />
1312

13+
<meta name="robots" content="index,follow" />
14+
1415
<!-- Open Graph for social sharing -->
15-
<meta property="og:title" content="InvestCount | Bank Interest Calculator" />
16-
<meta property="og:description" content="Calculate your bank deposit interest based on your capital and bank selection. Compare rates and maximize your savings with InvestCount." />
16+
<meta property="og:title" content="Kalkulator Deposito Bank Indonesia" />
17+
<meta property="og:description" content="Hitung bunga deposito, pajak 20%, dan hasil bersih. Bandingkan suku bunga & tenor berbagai bank di Indonesia." />
1718
<meta property="og:image" content="/assets/web_icon.svg" />
18-
<meta property="og:url" content="https://investcount.mattrmost.com" />
19+
<meta property="og:site_name" content="InvestCount" />
1920
<meta property="og:type" content="website" />
20-
<meta property="og:locale" content="en_US" />
21+
<meta property="og:locale" content="id_ID" />
22+
<meta property="og:url" content="https://investcount.mattrmost.com/" />
2123

2224
<!-- Canonical URL -->
2325
<link rel="canonical" href="https://investcount.mattrmost.com" />
2426

25-
<script src="https://autoback.link/autobacklink.js?ref=investcount.mattrmost.com" defer async></script>
27+
<!-- Structured Data: WebSite -->
28+
<script type="application/ld+json">
29+
{
30+
"@context": "https://schema.org",
31+
"@type": "WebSite",
32+
"name": "InvestCount",
33+
"url": "https://investcount.mattrmost.com/",
34+
"inLanguage": "id-ID",
35+
"potentialAction": {
36+
"@type": "SearchAction",
37+
"target": "https://investcount.mattrmost.com/?q={search_term_string}",
38+
"query-input": "required name=search_term_string"
39+
}
40+
}
41+
</script>
42+
43+
<!-- Structured Data: SoftwareApplication (menjelaskan app kalkulator web) -->
44+
<script type="application/ld+json">
45+
{
46+
"@context": "https://schema.org",
47+
"@type": "SoftwareApplication",
48+
"name": "Kalkulator Deposito InvestCount",
49+
"applicationCategory": "FinanceApplication",
50+
"operatingSystem": "Web",
51+
"url": "https://investcount.mattrmost.com/",
52+
"price": "0",
53+
"offers": {
54+
"@type": "Offer",
55+
"price": "0",
56+
"priceCurrency": "IDR"
57+
}
58+
}
59+
</script>
60+
61+
<!-- Structured Data: FAQ (bantu rich results) -->
62+
<script type="application/ld+json">
63+
{
64+
"@context": "https://schema.org",
65+
"@type": "FAQPage",
66+
"mainEntity": [
67+
{
68+
"@type": "Question",
69+
"name": "Bagaimana cara menghitung bunga deposito?",
70+
"acceptedAnswer": {
71+
"@type": "Answer",
72+
"text": "Masukkan modal, tenor, dan suku bunga. InvestCount menghitung bunga kotor, pajak deposito (20%), dan hasil bersih. Anda juga dapat mengaktifkan simulasi ARO untuk compounding."
73+
}
74+
},
75+
{
76+
"@type": "Question",
77+
"name": "Berapa pajak deposito di Indonesia?",
78+
"acceptedAnswer": {
79+
"@type": "Answer",
80+
"text": "Pajak bunga deposito umumnya 20% sesuai ketentuan yang berlaku untuk nominal tertentu. Hasil perhitungan InvestCount sudah memperhitungkan pajak ini."
81+
}
82+
},
83+
{
84+
"@type": "Question",
85+
"name": "Apakah InvestCount mendukung ARO (perpanjangan otomatis)?",
86+
"acceptedAnswer": {
87+
"@type": "Answer",
88+
"text": "Ya. Aktifkan opsi ARO untuk melihat efek perpanjangan otomatis pada akhir tenor dan dampaknya terhadap total keuntungan bersih."
89+
}
90+
}
91+
]
92+
}
93+
</script>
2694
</head>
2795
<body>
2896
<div id="root"></div>

src/components/MetaTagController/MetaTagController.tsx

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/constants/DepositType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export const DepositType = {
22
ARO: 'ARO',
3-
NONARO: 'Non-Aro',
3+
NONARO: 'Non-ARO',
44
AROPLUS: 'ARO+'
55
}

src/pages/HomePage/HomePage.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import BudgetPlannerSection from '@/components/BudgetPlannerSection/BudgetPlannerSection'
2-
import DepositRateComparisonSection from '@/components/DepositRateComparisonSection/DepositRateComparisonSection'
3-
import DepositSection from '@/components/DepositSection/DepositSection'
4-
import Footer from '@/components/Footer/Footer'
5-
import Hero from '@/components/Hero/Hero'
6-
import LPSSection from '@/components/LPSSection/LPSSection'
1+
import BudgetPlannerSection from '@/pages/HomePage/components/BudgetPlannerSection/BudgetPlannerSection'
2+
import DepositRateComparisonSection from '@/pages/HomePage/components/DepositRateComparisonSection/DepositRateComparisonSection'
3+
import DepositSection from '@/pages/HomePage/components/DepositSection/DepositSection'
4+
import Footer from '@/pages/HomePage/components/Footer/Footer'
5+
import Hero from '@/pages/HomePage/components/Hero/Hero'
6+
import LPSSection from '@/pages/HomePage/components/LPSSection/LPSSection'
77
import { useRef } from 'react'
88

99
const HomePage = () => {

src/components/BudgetPlannerSection/BudgetPlannerSection.tsx renamed to src/pages/HomePage/components/BudgetPlannerSection/BudgetPlannerSection.tsx

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,13 @@ const BudgetPlannerSection = () => {
6060

6161
const validateDepositAmount = () => {
6262
if (!depositInput.trim()) {
63-
return 'Deposit amount is required.'
63+
return 'Jumlah deposit tidak boleh kosong.'
6464
}
6565
if (isNaN(Number(depositInput.replace(/,/g, '')))) {
66-
return 'Deposit amount must be numeric.'
66+
return 'Jumlah deposit harus berupa angka yang valid.'
67+
}
68+
if (Number(depositInput.replace(/,/g, '')) < 10000000) {
69+
return 'Jumlah deposit minimal adalah 10.000.000 IDR.'
6770
}
6871
return null
6972
}
@@ -79,9 +82,9 @@ const BudgetPlannerSection = () => {
7982
setField(formattedValue)
8083
} else if (fieldName == 'depositInput') {
8184
if (!depositInput) {
82-
newErrors.depositInput = 'Deposit is required'
85+
newErrors.depositInput = 'Jumlah deposit tidak boleh kosong.'
8386
} else if (!isNumberAndDecimalRegex.test(parseAmountInputFromCommas(depositInput))) {
84-
newErrors.depositInput = 'Deposit should be a valid number'
87+
newErrors.depositInput = 'Jumlah deposit harus berupa angka yang valid.'
8588
}
8689
const formattedValue = formatNumberWithCommas(value)
8790
setField(formattedValue)
@@ -96,15 +99,15 @@ const BudgetPlannerSection = () => {
9699
let isValid = true
97100

98101
if (!needInput) {
99-
newErrors.needInput = 'Need is required'
102+
newErrors.needInput = 'Kebutuhan tidak boleh kosong'
100103
isValid = false
101104
}
102105

103106
if (!priceInput) {
104-
newErrors.priceInput = 'Price is required'
107+
newErrors.priceInput = 'Biaya tidak boleh kosong'
105108
isValid = false
106109
} else if (!isNumberAndDecimalRegex.test(parseAmountInputFromCommas(priceInput))) {
107-
newErrors.priceInput = 'Price should be a valid number'
110+
newErrors.priceInput = 'Biaya harus berupa angka yang valid'
108111
isValid = false
109112
}
110113

@@ -131,37 +134,38 @@ const BudgetPlannerSection = () => {
131134
className='text-center text-2xl md:text-3xl font-bold text-charter-blue-600 mt-8 mb-4'
132135
variants={childVariants}
133136
>
134-
Budget Planner
137+
Rencanakan Anggaran Bulanan
135138
</motion.h1>
136139

137140
<motion.p
138-
className='text-center text-charter-blue text-lg md:text-xl mx-4 md:mx-10 mb-8'
141+
className='text-center text-charter-blue text-lg md:text-xl mx-4 md:mx-20 lg:mx-36 mb-16 mx-12'
139142
variants={childVariants}
140143
>
141-
Plan your monthly expenses and see how deposit returns can help cover your needs.
144+
Rencanakan pengeluaran bulanan Anda dan lihat bagaimana hasil bunga deposito bisa membantu
145+
menutup kebutuhan tersebut.
142146
</motion.p>
143147

144148
<motion.div
145-
className='card shadow-xl border-s-8 border-charter-blue mx-4 md:mx-20 lg:mx-36'
149+
className='card shadow-xl border-s-8 border-charter-blue mx-4 md:mx-20 lg:mx-36 mx-10'
146150
variants={childVariants}
147151
>
148-
<div className='card-body'>
152+
<div className='card-body bg-base-100 rounded-2xl shadow-lg p-6 md:p-10'>
149153
<motion.div
150-
className='grid grid-cols-1 md:grid-cols-2 gap-4 mt-10'
154+
className='grid grid-cols-1 md:grid-cols-2 gap-6 mt-6'
151155
variants={childVariants}
152156
>
153157
<InputField
154-
label='Need'
155-
placeholder='Enter need (e.g., Rent)'
158+
label='Kebutuhan'
159+
placeholder='Contoh: Sewa kos, Listrik, Netflix'
156160
type='text'
157161
value={needInput}
158162
onChange={(e) => handleInputChange(e, setNeedInput, 'needInput')}
159163
error={errors.needInput}
160164
/>
161165

162166
<InputField
163-
label='Price'
164-
placeholder='Enter price (e.g., 1200000)'
167+
label='Biaya (Rp)'
168+
placeholder='Contoh: 1.200.000'
165169
type='text'
166170
value={priceInput}
167171
onChange={(e) => handleInputChange(e, setPriceInput, 'priceInput')}
@@ -171,23 +175,29 @@ const BudgetPlannerSection = () => {
171175
<div className='col-span-1 md:col-span-2'>
172176
<button
173177
onClick={handleAddNeedWithValidation}
174-
className='btn btn-primary w-full text-[#ffffff]'
178+
className='btn btn-primary w-full text-[#ffffff] flex items-center gap-2 transition-all duration-150 hover:scale-105'
179+
aria-label='Tambahkan kebutuhan'
175180
>
176-
Add Need
181+
Tambahkan Kebutuhan
177182
</button>
178183
</div>
179184
</motion.div>
180185

181-
{needs.length > 0 && <NeedsSection needs={needs} onRemoveNeed={handleRemoveNeed} />}
186+
{needs.length > 0 && (
187+
<>
188+
<div className='divider my-6' />
189+
<NeedsSection needs={needs} onRemoveNeed={handleRemoveNeed} />
190+
</>
191+
)}
182192

183193
{needs.length > 0 && (
184194
<div className='mt-8'>
185195
<h3 className='text-lg font-semibold text-charter-blue-600 mb-2'>
186-
Enter Deposit Amount:
196+
Masukkan Jumlah Deposito
187197
</h3>
188198
<InputField
189-
label='Deposit Amount'
190-
placeholder='Enter deposit amount (e.g., 5000000)'
199+
label='Jumlah Deposito'
200+
placeholder='Minimal 10.000.000'
191201
type='text'
192202
value={depositInput}
193203
onChange={(e) => handleInputChange(e, setDepositInput, 'depositInput')}
@@ -203,7 +213,12 @@ const BudgetPlannerSection = () => {
203213
/>
204214
)}
205215

206-
{recommendation && <RecommendationSection recommendation={recommendation} />}
216+
{recommendation && (
217+
<>
218+
<div className='divider my-6' />
219+
<RecommendationSection recommendation={recommendation} />
220+
</>
221+
)}
207222
</div>
208223
</motion.div>
209224
</motion.div>

src/components/BudgetPlannerSection/DepositDropdownSection/DepositDropdownSection.tsx renamed to src/pages/HomePage/components/BudgetPlannerSection/DepositDropdownSection/DepositDropdownSection.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ const DepositDropdownSection = (props: DepositDropdownSectionProps) => {
2323

2424
return (
2525
<div className='mt-4'>
26-
<h3 className='text-lg font-semibold text-charter-blue-600 mb-2'>Select a Bank:</h3>
26+
<h3 className='text-lg font-semibold text-charter-blue-600 mb-2'>Pilih Bank untuk Deposit</h3>
2727
<div className='dropdown'>
2828
<div tabIndex={0} role='button' className='btn btn-primary text-[#ffffff]'>
29-
Select a bank
29+
Pilih Bank
3030
</div>
3131
<div
3232
tabIndex={0}

src/components/BudgetPlannerSection/NeedsSection/NeedsSection.tsx renamed to src/pages/HomePage/components/BudgetPlannerSection/NeedsSection/NeedsSection.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const NeedsSection = (props: NeedsSectionProps) => {
1313

1414
return (
1515
<div className='mt-8'>
16-
<h3 className='text-lg font-semibold text-charter-blue-600 mb-2'>Your Needs:</h3>
16+
<h3 className='text-lg font-semibold text-charter-blue-600 mb-2'>Daftar Kebutuhan Anda</h3>
1717
<div className='flex flex-wrap gap-2'>
1818
{needs.map((item, index) => (
1919
<div

src/components/BudgetPlannerSection/RecommendationSection/RecommendationSection.tsx renamed to src/pages/HomePage/components/BudgetPlannerSection/RecommendationSection/RecommendationSection.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ interface RecommendationSectionProps {
55
const RecommendationSection = (props: RecommendationSectionProps) => {
66
const { recommendation } = props
77

8-
const isPositive = recommendation.toLowerCase().includes('have')
8+
const isPositive = recommendation.toLowerCase().includes('sisa')
99

1010
const handleExportToTxt = () => {
1111
const element = document.createElement('a')
@@ -20,15 +20,15 @@ const RecommendationSection = (props: RecommendationSectionProps) => {
2020
return (
2121
<div className='mt-8'>
2222
<div
23-
className={`flex flex flex-col sm:flex-row justify-between alert shadow-lg whitespace-pre-line p-6 rounded-lg ${
23+
className={`flex flex-col alert shadow-lg whitespace-pre-line p-6 rounded-lg ${
2424
isPositive
2525
? 'bg-green-100 border-green-500 text-green-800'
2626
: 'bg-red-100 border-red-500 text-red-800'
2727
}`}
2828
>
29-
<span className='text-lg text-left font-medium'>{recommendation}</span>
29+
<div className='text-lg text-left font-medium'>{recommendation}</div>
3030
<button onClick={handleExportToTxt} className='mt-4 btn btn-primary text-sm text-[#ffffff]'>
31-
Download
31+
Unduh
3232
</button>
3333
</div>
3434
</div>

0 commit comments

Comments
 (0)