https://github.com/plus62store/new_plus62store
Toko Online Jekyll simpleCart x Midtrans checkout WhatsApp form
https://github.com/plus62store/new_plus62store
firebase-auth firestore ionic-framework jekyll jekyll-ionic jekyll-onlineshop midtrans online-shop pwa-apps spa
Last synced: 4 months ago
JSON representation
Toko Online Jekyll simpleCart x Midtrans checkout WhatsApp form
- Host: GitHub
- URL: https://github.com/plus62store/new_plus62store
- Owner: plus62store
- License: mit
- Created: 2025-03-12T13:30:02.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2026-02-10T04:12:51.000Z (4 months ago)
- Last Synced: 2026-02-10T09:11:54.205Z (4 months ago)
- Topics: firebase-auth, firestore, ionic-framework, jekyll, jekyll-ionic, jekyll-onlineshop, midtrans, online-shop, pwa-apps, spa
- Language: JavaScript
- Homepage: https://plus62store.pages.dev
- Size: 7.81 MB
- Stars: 1
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Jekyllionic Boilerplate
JekyllIonic Boilerplate is a lightweight and cleaned up version of the initial [Jekyll](https://jekyllrb.com/) with [ionic](https://ionicframework.com/docs/components) setup. The motivation behind this project was for me to avoid doing the same things over and over every time I build yet another site with Jekyll.
## Features
* ionic 8
* Single Page Application (SPA)
* PWA
* firestore (firebase)
* Admin Dashboard
* simpleCart Customized
* Midtrans Payment integration
* Redeem Coins
## Rules firestore
```shell
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read: if request.auth != null && request.auth.uid == userId;
allow update: if request.auth != null &&
request.auth.uid == userId &&
isSafeUpdate(request.resource.data, resource.data);
allow create: if request.auth != null && request.auth.uid == userId;
allow delete: if false;
}
function isSafeUpdate(newData, oldData) {
// Hanya izinkan field-field berikut yang bisa diubah
return newData.keys().hasOnly([
'coins',
'email',
'updatedAt',
'name',
'phone',
'address',
'photoURL'
]) &&
(!newData.keys().hasAny(['email']) || newData.email == oldData.email) &&
(newData.name != null && newData.name != "");
}
function isValidWhatsapp(phone) {
return phone is string &&
phone.size() >= 13 &&
phone.matches('^08[0-9]+$');
}
function isValidURL(photoURL) {
return photoURL is string && photoURL.matches('^https?://');
}
function isValidNama(name) {
return name is string && name.size() > 0;
}
// Validasi perubahan coins: perubahan tidak ekstrem (misalnya max ±10.000)
function isValidCoinsChange(newCoins, oldCoins) {
return newCoins is number &&
oldCoins is number &&
newCoins >= 0 &&
(newCoins - oldCoins).abs() <= 10000;
}
}
}
```
## Credits
* [Jekyll](https://jekyllrb.com/)
* [ionic](https://ionicframework.com/docs/components)
* [Daffa Mia](https://github.com/daffadev-mia)
* [DEMO](https://plus62webstore.pages.dev)