├── .editorconfig ├── .github └── FUNDING.yml ├── .gitignore ├── .sourcemaps └── main.js.map ├── LICENSE ├── README.md ├── config.xml ├── home.png ├── ionic.config.json ├── ionic.project ├── package-lock.json ├── package.json ├── resources ├── android │ ├── icon │ │ ├── drawable-hdpi-icon.png │ │ ├── drawable-ldpi-icon.png │ │ ├── drawable-mdpi-icon.png │ │ ├── drawable-xhdpi-icon.png │ │ ├── drawable-xxhdpi-icon.png │ │ └── drawable-xxxhdpi-icon.png │ └── splash │ │ ├── drawable-land-hdpi-screen.png │ │ ├── drawable-land-ldpi-screen.png │ │ ├── drawable-land-mdpi-screen.png │ │ ├── drawable-land-xhdpi-screen.png │ │ ├── drawable-land-xxhdpi-screen.png │ │ ├── drawable-land-xxxhdpi-screen.png │ │ ├── drawable-port-hdpi-screen.png │ │ ├── drawable-port-ldpi-screen.png │ │ ├── drawable-port-mdpi-screen.png │ │ ├── drawable-port-xhdpi-screen.png │ │ ├── drawable-port-xxhdpi-screen.png │ │ └── drawable-port-xxxhdpi-screen.png ├── icon.png ├── ios │ ├── icon │ │ ├── icon-40.png │ │ ├── icon-40@2x.png │ │ ├── icon-40@3x.png │ │ ├── icon-50.png │ │ ├── icon-50@2x.png │ │ ├── icon-60.png │ │ ├── icon-60@2x.png │ │ ├── icon-60@3x.png │ │ ├── icon-72.png │ │ ├── icon-72@2x.png │ │ ├── icon-76.png │ │ ├── icon-76@2x.png │ │ ├── icon-83.5@2x.png │ │ ├── icon-small.png │ │ ├── icon-small@2x.png │ │ ├── icon-small@3x.png │ │ ├── icon.png │ │ └── icon@2x.png │ └── splash │ │ ├── Default-568h@2x~iphone.png │ │ ├── Default-667h.png │ │ ├── Default-736h.png │ │ ├── Default-Landscape-736h.png │ │ ├── Default-Landscape@2x~ipad.png │ │ ├── Default-Landscape@~ipadpro.png │ │ ├── Default-Landscape~ipad.png │ │ ├── Default-Portrait@2x~ipad.png │ │ ├── Default-Portrait@~ipadpro.png │ │ ├── Default-Portrait~ipad.png │ │ ├── Default@2x~iphone.png │ │ └── Default~iphone.png └── splash.png ├── signin.png ├── src ├── app │ ├── app.component.ts │ ├── app.constant.ts │ ├── app.module.ts │ ├── app.scss │ └── main.ts ├── assets │ ├── icon │ │ └── favicon.ico │ └── images │ │ ├── logo.png │ │ └── placeholder.png ├── declarations.d.ts ├── index.html ├── manifest.json ├── pages │ ├── about │ │ ├── about.html │ │ ├── about.scss │ │ └── about.ts │ ├── contact │ │ ├── contact.html │ │ ├── contact.scss │ │ └── contact.ts │ ├── home │ │ ├── home.html │ │ ├── home.scss │ │ └── home.ts │ ├── signin │ │ ├── signin.html │ │ ├── signin.scss │ │ └── signin.ts │ ├── signup │ │ ├── signup.html │ │ ├── signup.scss │ │ └── signup.ts │ └── tabs │ │ ├── tabs.html │ │ └── tabs.ts ├── providers │ ├── auth │ │ └── auth.ts │ └── parse │ │ └── parse.ts ├── service-worker.js └── theme │ └── variables.scss ├── tsconfig.json ├── tslint.json └── typings └── cordova-typings.d.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | 10 | # We recommend you to keep these unchanged 11 | end_of_line = lf 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | insert_final_newline = true 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: murraco # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Specifies intentionally untracked files to ignore when using Git 2 | # http://git-scm.com/docs/gitignore 3 | 4 | *~ 5 | *.sw[mnpcod] 6 | *.log 7 | *.tmp 8 | *.tmp.* 9 | log.txt 10 | *.sublime-project 11 | *.sublime-workspace 12 | .vscode/ 13 | npm-debug.log* 14 | 15 | .idea/ 16 | .sass-cache/ 17 | .tmp/ 18 | .versions/ 19 | coverage/ 20 | dist/ 21 | node_modules/ 22 | tmp/ 23 | temp/ 24 | hooks/ 25 | platforms/ 26 | plugins/ 27 | plugins/android.json 28 | plugins/ios.json 29 | www/ 30 | $RECYCLE.BIN/ 31 | 32 | .DS_Store 33 | Thumbs.db 34 | UserInterfaceState.xcuserstate 35 | -------------------------------------------------------------------------------- /.sourcemaps/main.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../../src/pages/tabs/tabs.ts","../../node_modules/@angular/core/@angular lazy","../../src lazy","../../src/app/app.constant.ts","../../src/pages/signup/signup.ts","../../src/pages/about/about.ts","../../src/pages/contact/contact.ts","../../src/pages/home/home.ts","../../src/providers/parse/parse.ts","../../src/app/main.ts","../../src/app/app.module.ts","../../src/app/app.component.ts","../../src/providers/auth/auth.ts","../../src/pages/signin/signin.ts"],"names":[],"mappings":"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","file":"main.js","sourcesContent":["import { Component } from '@angular/core';\n\n// Providers\nimport { AuthProvider } from '../../providers/auth/auth';\n\n// Pages\nimport { AboutPage } from '../about/about';\nimport { ContactPage } from '../contact/contact';\nimport { HomePage } from '../home/home';\n\n@Component({\n templateUrl: 'tabs.html'\n})\nexport class TabsPage {\n tab1Root = HomePage;\n tab2Root = AboutPage;\n tab3Root = ContactPage;\n\n constructor(private auth: AuthProvider) { }\n\n ionViewCanEnter(): boolean {\n return this.auth.authenticated();\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/tabs/tabs.ts","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncatched exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 183;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@angular/core/@angular lazy\n// module id = 183\n// module chunks = 0","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncatched exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 224;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src lazy\n// module id = 224\n// module chunks = 0","export const ENV = {\n production: false,\n parseAppId: 'APPLICATION_ID',\n parseServerUrl: 'http://localhost:1337/parse'\n}\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.constant.ts","import { Component } from '@angular/core';\nimport { NavController, LoadingController } from 'ionic-angular';\n\n// Providers\nimport { AuthProvider } from '../../providers/auth/auth';\n\n// Pages\nimport { TabsPage } from '../tabs/tabs';\n\n@Component({\n selector: 'page-signup',\n templateUrl: 'signup.html'\n})\nexport class SignupPage {\n password: string = '';\n username: string = '';\n verify: string = '';\n email: string = '';\n\n constructor(public navCtrl: NavController, private authPvdr: AuthProvider, private loadCtrl: LoadingController) { }\n\n ionViewDidLoad() {\n console.log('Initiate Signup');\n }\n\n // TODO: form validation\n public doRegister() {\n let loader = this.loadCtrl.create({\n content: 'Signing up...'\n });\n loader.present();\n\n this.authPvdr.signup(this.username, this.password, this.email).subscribe((success) => {\n this.navCtrl.setRoot(TabsPage);\n loader.dismissAll();\n }, (error) => {\n loader.dismissAll();\n });\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/signup/signup.ts","import { Component } from '@angular/core';\nimport { App, NavController } from 'ionic-angular';\n\n// Providers\nimport { AuthProvider } from '../../providers/auth/auth';\n\n// Pages\nimport { SigninPage } from '../signin/signin';\n\n@Component({\n selector: 'page-about',\n templateUrl: 'about.html'\n})\nexport class AboutPage {\n\n constructor(private auth: AuthProvider, private app: App) { }\n\n ionViewCanEnter(): boolean {\n return this.auth.authenticated();\n }\n\n public signout() {\n this.auth.signout().subscribe(() => {\n this.app.getRootNav().setRoot(SigninPage);\n });\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/about/about.ts","import { Component } from '@angular/core';\nimport { App } from 'ionic-angular';\n\n// Providers\nimport { AuthProvider } from '../../providers/auth/auth';\n\n// Pages\nimport { SigninPage } from '../signin/signin';\n\n@Component({\n selector: 'page-contact',\n templateUrl: 'contact.html'\n})\nexport class ContactPage {\n\n constructor(private auth: AuthProvider, private app: App) { }\n\n ionViewCanEnter(): boolean {\n return this.auth.authenticated();\n }\n\n public signout() {\n this.auth.signout().subscribe(() => {\n this.app.getRootNav().setRoot(SigninPage);\n });\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/contact/contact.ts","import { Component } from '@angular/core';\nimport { App } from 'ionic-angular';\n\n// Providers\nimport { ParseProvider } from '../../providers/parse/parse';\nimport { AuthProvider } from '../../providers/auth/auth';\n\n// Pages\nimport { SigninPage } from '../signin/signin';\n\n@Component({\n selector: 'page-home',\n templateUrl: 'home.html'\n})\nexport class HomePage {\n newScore = { playerName: null, score: null };\n gameScores = [];\n\n constructor(private parseProvider: ParseProvider, private auth: AuthProvider, private app: App) {\n this.listScores();\n }\n\n ionViewCanEnter(): boolean {\n return this.auth.authenticated();\n }\n\n public listScores(): Promise {\n let offset = this.gameScores.length;\n let limit = 10;\n return this.parseProvider.getGameScores(offset, limit).then((result) => {\n for (let i = 0; i < result.length; i++) {\n let object = result[i];\n this.gameScores.push(object);\n }\n }, (error) => {\n console.log(error);\n });\n }\n\n public postGameScore() {\n this.parseProvider.addGameScore(this.newScore).then((gameScore) => {\n this.gameScores.push(gameScore);\n this.newScore.playerName = null;\n this.newScore.score = null;\n }, (error) => {\n console.log(error);\n alert('Error adding score.');\n });\n }\n\n public signout() {\n this.auth.signout().subscribe(() => {\n this.app.getRootNav().setRoot(SigninPage);\n });\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/home/home.ts","import { Injectable } from '@angular/core';\nimport 'rxjs/add/operator/map';\n\n// Parse\nimport { Parse } from 'parse';\n\n// Constants\nimport { ENV } from '../../app/app.constant';\n\n@Injectable()\nexport class ParseProvider {\n private parseAppId: string = ENV.parseAppId;\n private parseServerUrl: string = ENV.parseServerUrl;\n\n constructor() {\n this.parseInitialize();\n console.log('Initiated Parse');\n }\n\n public getGameScores(offset: number = 0, limit: number = 3): Promise {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n const GameScore = Parse.Object.extend('GameScore');\n let query = new Parse.Query(GameScore);\n query.skip(offset);\n query.limit(limit);\n query.find().then((gameScores) => {\n resolve(gameScores);\n }, (error) => {\n reject(error);\n });\n }, 500);\n });\n }\n\n public addGameScore(newScore): Promise {\n const GameScore = Parse.Object.extend('GameScore');\n \n let gameScore = new GameScore();\n gameScore.set('score', parseInt(newScore.score));\n gameScore.set('playerName', newScore.playerName);\n gameScore.set('cheatMode', false);\n\n return gameScore.save(null, {\n success: function (gameScore) {\n console.log(gameScore);\n return gameScore;\n },\n error: function (gameScore, error) {\n console.log(error);\n return error;\n }\n });\n }\n\n private parseInitialize() {\n Parse.initialize(this.parseAppId);\n Parse.serverURL = this.parseServerUrl;\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/providers/parse/parse.ts","import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app.module';\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/main.ts","import { NgModule, ErrorHandler } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';\n\n// App\nimport { MyApp } from './app.component';\n\n// Native imports\nimport { StatusBar } from '@ionic-native/status-bar';\nimport { SplashScreen } from '@ionic-native/splash-screen';\n\n// Providers\nimport { ParseProvider } from '../providers/parse/parse';\nimport { AuthProvider } from '../providers/auth/auth';\n\n// Pages\nimport { AboutPage } from '../pages/about/about';\nimport { ContactPage } from '../pages/contact/contact';\nimport { HomePage } from '../pages/home/home';\nimport { TabsPage } from '../pages/tabs/tabs';\nimport { SigninPage } from '../pages/signin/signin';\nimport { SignupPage } from '../pages/signup/signup';\n\n@NgModule({\n declarations: [\n MyApp,\n AboutPage,\n ContactPage,\n HomePage,\n TabsPage,\n SigninPage,\n SignupPage\n ],\n imports: [\n BrowserModule,\n IonicModule.forRoot(MyApp)\n ],\n bootstrap: [IonicApp],\n entryComponents: [\n MyApp,\n AboutPage,\n ContactPage,\n HomePage,\n TabsPage,\n SigninPage,\n SignupPage\n ],\n providers: [\n StatusBar,\n SplashScreen,\n { provide: ErrorHandler, useClass: IonicErrorHandler },\n ParseProvider,\n AuthProvider\n ]\n})\nexport class AppModule { }\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.module.ts","import { Component } from '@angular/core';\nimport { Platform } from 'ionic-angular';\nimport { StatusBar } from '@ionic-native/status-bar';\nimport { SplashScreen } from '@ionic-native/splash-screen';\n\n// Initial page\nimport { SigninPage } from '../pages/signin/signin';\n\n@Component({\n template: ''\n})\nexport class MyApp {\n rootPage: any = SigninPage;\n\n constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {\n platform.ready().then(() => {\n // Okay, so the platform is ready and our plugins are available.\n // Here you can do any higher level native things you might need.\n statusBar.styleDefault();\n splashScreen.hide();\n });\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.component.ts","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs/Observable';\nimport 'rxjs/add/operator/map';\n\n// Parse\nimport { Parse } from 'parse';\n\n// Constants\nimport { ENV } from '../../app/app.constant';\n\nexport class User {\n public id: string;\n public name: string;\n public email: string;\n}\n\n@Injectable()\nexport class AuthProvider {\n private parseAppId: string = ENV.parseAppId;\n private parseServerUrl: string = ENV.parseServerUrl;\n\n constructor() {\n this.parseInitialize();\n console.log('Initiated Auth');\n }\n\n public signin(username: string, password: string): Observable {\n return new Observable((observer) => {\n Parse.User.logIn(username, password, {\n success: function (user) {\n observer.next(true);\n observer.complete();\n },\n error: function (user, error) {\n // If the user inputs the email instead of the username\n var userQuery = new Parse.Query(Parse.User);\n\n userQuery.equalTo('email', username);\n userQuery.first().then(function (success) {\n var username = success.toJSON().username; \n Parse.User.logIn(username, password, {\n success: function (user) {\n observer.next(true);\n observer.complete();\n },\n error: function (user, error) {\n observer.error(error);\n observer.complete();\n }\n });\n }, function (error) {\n observer.error(error);\n observer.complete();\n });\n \n }\n });\n });\n }\n\n public signup(username: string, password: string, email: string): Observable {\n return new Observable((observer) => {\n var user = new Parse.User();\n user.set('username', username);\n user.set('password', password);\n user.set('email', email);\n\n user.signUp(null, {\n success: (user) => {\n observer.next(true);\n observer.complete();\n },\n error: (user, error) => {\n observer.error(error);\n observer.complete();\n }\n });\n\n });\n }\n\n public signout(): Observable {\n return new Observable((observer) => {\n Parse.User.logOut().then(() => observer.next(true));\n });\n }\n\n public currentUser(): User {\n let u = Parse.User.current();\n if (u) {\n var user = new User();\n user.id = u.id;\n user.name = u.get('username');\n user.email = u.get('email');\n return user;\n }\n return null\n }\n\n public authenticated(): boolean {\n return this.currentUser() !== null;\n }\n\n private parseInitialize() {\n Parse.initialize(this.parseAppId);\n Parse.serverURL = this.parseServerUrl;\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/providers/auth/auth.ts","import { Component } from '@angular/core';\nimport { NavController, LoadingController } from 'ionic-angular';\n\n// Providers\nimport { AuthProvider } from '../../providers/auth/auth';\n\n// Pages\nimport { SignupPage } from '../signup/signup';\nimport { TabsPage } from '../tabs/tabs';\n\n@Component({\n selector: 'page-signin',\n templateUrl: 'signin.html'\n})\nexport class SigninPage {\n registerPage = SignupPage;\n password: string = '';\n username: string = '';\n\n constructor(public navCtrl: NavController, private loadCtrl: LoadingController, private authPvdr: AuthProvider) { }\n\n ionViewDidLoad() {\n console.log('Initiated Signin');\n }\n\n public doSignin() {\n let loader = this.loadCtrl.create({\n content: 'Signing in...'\n });\n loader.present();\n\n this.authPvdr.signin(this.username, this.password).subscribe((success) => {\n this.navCtrl.setRoot(TabsPage);\n loader.dismissAll();\n }, (error) => {\n alert('Invalid username or password');\n loader.dismissAll();\n });\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/pages/signin/signin.ts"],"sourceRoot":""} -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Mauricio Urraco 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ionic Parse Server 2 | 3 | ![](https://img.shields.io/badge/build-success-brightgreen.svg) 4 | 5 | # Stack 6 | 7 | ![](https://img.shields.io/badge/ionic_3-✓-blue.svg) 8 | ![](https://img.shields.io/badge/angular_2+-✓-blue.svg) 9 | ![](https://img.shields.io/badge/parse_server-✓-blue.svg) 10 | 11 | # About this starter 12 | 13 | This is a simple starter for integrating Ionic 3, Angular 4+ and Parse Server. It provides a small PoC (Proof of Concept) app for adding/removing scores and uses signin/signout based on Parse Server. You can just use it as the foundation for your next big app. 14 | 15 | ## Some screenshots 16 | 17 |

18 | 19 | 20 |

21 | 22 | # File structure 23 | 24 | ``` 25 | ionic-parse-server/ 26 | │ 27 | ├── resources/ 28 | │ 29 | ├── src/ 30 | │ ├── app/ 31 | │ │ ├── app.constant.ts 32 | │ │ ├── app.component.ts 33 | │ │ ├── app.module.ts 34 | │ │ ├── app.template.html 35 | │ │ └── main.ts 36 | │ │ 37 | │ ├── assets/ 38 | │ │ └── icon/ 39 | │ │ └── favicon.ico 40 | │ │ 41 | │ ├── pages/ 42 | │ │ ├── about/ 43 | │ │ │ ├── about.html 44 | │ │ │ ├── about.ts 45 | │ │ │ └── about.scss 46 | │ │ │ 47 | │ │ ├── account/ 48 | │ │ │ ├── account.html 49 | │ │ │ ├── account.ts 50 | │ │ │ └── account.scss 51 | │ │ │ 52 | │ │ │── contact/ 53 | │ │ │ ├── contact.html 54 | │ │ │ ├── contact.ts 55 | │ │ │ └── contact.scss 56 | │ │ │ 57 | │ │ │── home/ 58 | │ │ │ ├── home.html 59 | │ │ │ ├── home.ts 60 | │ │ │ └── home.scss 61 | │ │ │ 62 | │ │ │── signin/ 63 | │ │ │ ├── signin.html 64 | │ │ │ ├── signin.ts 65 | │ │ │ └── signin.scss 66 | │ │ │ 67 | │ │ ├── signup/ 68 | │ │ │ ├── signup.html 69 | │ │ │ └── signup.ts 70 | │ │ │ 71 | │ │ └── tabs/ 72 | │ │ ├── tabs.html 73 | │ │ └── tabs.ts 74 | │ │ 75 | │ ├── providers/ 76 | │ │ │── auth/ 77 | │ │ │ └── auth.ts 78 | │ │ │ 79 | │ │ └── parse/ 80 | │ │ └── parse.ts 81 | │ │ 82 | │ ├── theme/ 83 | │ │ └── variables.scss 84 | │ │ 85 | │ └── index.html 86 | │ 87 | ├── typings/ 88 | │ └── cordova-typings.d.ts 89 | │ 90 | ├── .editorconfig * Defines coding styles between editors 91 | ├── .gitignore * Example git ignore file 92 | ├── config.xml * Cordova configuration file 93 | ├── ionic.config.json * Ionic configuration file 94 | ├── LICENSE * MIT License 95 | ├── package.json * Defines our JavaScript dependencies 96 | ├── package-lock.json * Defines our exact JavaScript dependencies tree 97 | ├── README.md * This file 98 | ├── tsconfig.json * Defines the root files and the compiler options 99 | ├── tslint.json 100 | └── *.png * Images for the README.md 101 | ``` 102 | 103 | ## Ionic Framework 104 | 105 | The Ionic framework allows for the creation of highly interactive, **cross-platform mobile applications** that can be deployed across iOS, Android, and Windows devices. These hybrid applications include native functionalities, exhaustive gestures, and customizable tools to enhance user-friendliness. Those powerful capabilities are brought to Ionic because it provides mobile-friendly `HTML`, `JS`, and `CSS` components to developers. 106 | 107 | Some of its advantages are: 108 | 109 | - Open source 110 | - Code once, run on all mobile devices 111 | - One programming language for all mobile OS 112 | - Use of well-known web technologies 113 | - A huge community 114 | 115 | ## Parse Server 116 | 117 | **Parse Server** is an open source version of the Parse backend that can be deployed to any infrastructure that can run `Node.js`. It works with the Express web application framework and can be added to existing web applications, or run by itself. Its repository on [Github](https://github.com/parse-community/parse-server) is very active with ~165 contributors and ~14K stars so even if you didn't use the hosted Parse platform before, its open source version is a wise choice if you need to build a backend for you mobile app or your clients apps. 118 | 119 | Parse offer a backend to store data, push notifications, social media integration for your app etc. The features provided tend to be helpful in prototyping quickly. 120 | 121 | - **General Purpose**: Open Source 122 | - **Hosting**: Self-hosting or Parse Server Hosting providers. Supports local testing and development 123 | - **Custom Code**: Supported via Cloud Code 124 | - **Database**: Mongo DB 125 | - **Push**: Support push notifications for Android, iOS. Also users can manage Push Notifications campaigns 126 | - **Storage**: No restricted time limits and no file storage restrictions. Control over backup, restore and database indexes 127 | - **Ideal for**: General purpose applications 128 | 129 | ## How to use this starter? 130 | 131 | 1. Install Ionic 132 | 133 | ``` 134 | $ npm install -g ionic cordova 135 | ``` 136 | 137 | 2. Install and run Parse Server 138 | 139 | ``` 140 | $ npm install -g parse-server mongodb-runner 141 | $ mongodb-runner start 142 | $ parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://localhost/test 143 | ``` 144 | 145 | > You can use any arbitrary string as your application id and master key. These will be used by your clients to authenticate with the Parse Server. The application id and the parse url can be changed in `src/app/app.constant.ts`. 146 | 147 | 3. Fork this repository and clone it 148 | 149 | ``` 150 | $ git clone https://github.com//ionic-parse-server 151 | ``` 152 | 153 | 4. Navigate into the folder 154 | 155 | ``` 156 | $ cd ionic-parse-server 157 | ``` 158 | 159 | 5. Install NPM dependencies 160 | 161 | ``` 162 | $ npm install 163 | ``` 164 | 165 | 6. Run the project 166 | 167 | ``` 168 | $ ionic serve 169 | ``` 170 | 171 | 7. Navigate to `http://localhost:8100` in your browser 172 | 173 | ## Or if you only want to add Parse Server to your project 174 | 175 | 1. Go to the project directory: 176 | 177 | ``` 178 | cd my-project 179 | ``` 180 | 181 | 2. Install Parse SDK by running the following command 182 | 183 | ``` 184 | npm install parse --save 185 | ``` 186 | 187 | 3. Import `Parse` 188 | 189 | ```js 190 | import { Parse } from 'parse'; 191 | ``` 192 | 193 | 4. Declare your `parseAppId` and `parseServerUrl` 194 | 195 | ```js 196 | private parseAppId: string = 'APPLICATION_ID'; 197 | private parseServerUrl: string = 'http://localhost:1337/parse'; 198 | ``` 199 | 200 | 5. Initialize it on the constructor 201 | 202 | ```js 203 | constructor() { 204 | this.parseInitialize(); 205 | } 206 | 207 | private parseInitialize() { 208 | Parse.initialize(this.parseAppId); 209 | Parse.serverURL = this.parseServerUrl; 210 | } 211 | ``` 212 | **That's all!** Just create a provider, import Parse and start writing code 213 | 214 | # Contribution 215 | 216 | - Report issues 217 | - Open pull request with improvements 218 | - Spread the word 219 | - Reach out to me directly at 220 | 221 | # Buy me a coffee to show your support! 222 | 223 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/murraco) 224 | -------------------------------------------------------------------------------- /config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ionic Parse Server 4 | Clean and simple Ionic Parse Server Starter. 5 | Mauricio Urraco 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/home.png -------------------------------------------------------------------------------- /ionic.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-parse-server", 3 | "integrations": { 4 | "cordova": {} 5 | }, 6 | "type": "ionic-angular" 7 | } 8 | -------------------------------------------------------------------------------- /ionic.project: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-parse-server", 3 | "app_id": "" 4 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-parse-server", 3 | "version": "1.0.0", 4 | "author": "Mauricio Urraco ", 5 | "homepage": "https://github.com/murraco/", 6 | "private": true, 7 | "scripts": { 8 | "clean": "ionic-app-scripts clean", 9 | "build": "ionic-app-scripts build", 10 | "lint": "ionic-app-scripts lint", 11 | "ionic:build": "ionic-app-scripts build", 12 | "ionic:serve": "ionic-app-scripts serve" 13 | }, 14 | "dependencies": { 15 | "@angular/common": "4.1.0", 16 | "@angular/compiler": "4.1.0", 17 | "@angular/compiler-cli": "4.1.0", 18 | "@angular/core": "11.0.5", 19 | "@angular/forms": "4.1.0", 20 | "@angular/http": "4.1.0", 21 | "@angular/platform-browser": "4.1.0", 22 | "@angular/platform-browser-dynamic": "4.1.0", 23 | "@ionic-native/core": "3.7.0", 24 | "@ionic-native/splash-screen": "3.7.0", 25 | "@ionic-native/status-bar": "3.7.0", 26 | "@ionic/storage": "2.0.1", 27 | "cordova-android": "^10.1.1", 28 | "cordova-browser": "^6.0.0", 29 | "cordova-plugin-console": "^1.1.0", 30 | "cordova-plugin-device": "^1.1.7", 31 | "cordova-plugin-splashscreen": "^4.1.0", 32 | "cordova-plugin-statusbar": "^2.3.0", 33 | "cordova-plugin-whitelist": "^1.3.3", 34 | "ionic-angular": "3.2.1", 35 | "ionic-plugin-keyboard": "^2.2.1", 36 | "ionicons": "3.0.0", 37 | "parse": "^5.0.0", 38 | "rxjs": "5.1.1", 39 | "sw-toolbox": "3.6.0", 40 | "zone.js": "0.8.10" 41 | }, 42 | "devDependencies": { 43 | "@ionic/app-scripts": "^3.2.4", 44 | "@ionic/cli-plugin-ionic-angular": "1.1.2", 45 | "typescript": "2.2.1" 46 | }, 47 | "description": "An Ionic project", 48 | "cordova": { 49 | "plugins": { 50 | "cordova-plugin-console": {}, 51 | "cordova-plugin-device": {}, 52 | "cordova-plugin-splashscreen": {}, 53 | "cordova-plugin-statusbar": {}, 54 | "cordova-plugin-whitelist": {}, 55 | "ionic-plugin-keyboard": {} 56 | }, 57 | "platforms": [ 58 | "android", 59 | "browser" 60 | ] 61 | }, 62 | "cordovaPlugins": [], 63 | "cordovaPlatforms": [ 64 | "android" 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /resources/android/icon/drawable-hdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/icon/drawable-hdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-ldpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/icon/drawable-ldpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-mdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/icon/drawable-mdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/icon/drawable-xhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/icon/drawable-xxhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/icon/drawable-xxxhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-land-hdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-land-ldpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-land-mdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-land-xhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-land-xxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-land-xxxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-port-hdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-port-ldpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-port-mdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-port-xhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-port-xxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/android/splash/drawable-port-xxxhdpi-screen.png -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/icon.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-40.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-40@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-40@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-50.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-50@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-60.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-60@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-60@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-72.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-72@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-76.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-76@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-83.5@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-small.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-small@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon-small@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon.png -------------------------------------------------------------------------------- /resources/ios/icon/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/icon/icon@2x.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-568h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-568h@2x~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-667h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-667h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-Landscape-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-Landscape@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-Landscape@~ipadpro.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-Landscape~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-Portrait@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-Portrait@~ipadpro.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default-Portrait~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default@2x~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/ios/splash/Default~iphone.png -------------------------------------------------------------------------------- /resources/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/resources/splash.png -------------------------------------------------------------------------------- /signin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/signin.png -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Platform } from 'ionic-angular'; 3 | import { StatusBar } from '@ionic-native/status-bar'; 4 | import { SplashScreen } from '@ionic-native/splash-screen'; 5 | 6 | // Initial page 7 | import { SigninPage } from '../pages/signin/signin'; 8 | 9 | @Component({ 10 | template: '' 11 | }) 12 | export class MyApp { 13 | rootPage: any = SigninPage; 14 | 15 | constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) { 16 | platform.ready().then(() => { 17 | // Okay, so the platform is ready and our plugins are available. 18 | // Here you can do any higher level native things you might need. 19 | statusBar.styleDefault(); 20 | splashScreen.hide(); 21 | }); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/app/app.constant.ts: -------------------------------------------------------------------------------- 1 | export const ENV = { 2 | production: false, 3 | parseAppId: 'APPLICATION_ID', 4 | parseServerUrl: 'http://localhost:1337/parse' 5 | } -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, ErrorHandler } from '@angular/core'; 2 | import { BrowserModule } from '@angular/platform-browser'; 3 | import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular'; 4 | 5 | // App 6 | import { MyApp } from './app.component'; 7 | 8 | // Native imports 9 | import { StatusBar } from '@ionic-native/status-bar'; 10 | import { SplashScreen } from '@ionic-native/splash-screen'; 11 | 12 | // Providers 13 | import { ParseProvider } from '../providers/parse/parse'; 14 | import { AuthProvider } from '../providers/auth/auth'; 15 | 16 | // Pages 17 | import { AboutPage } from '../pages/about/about'; 18 | import { ContactPage } from '../pages/contact/contact'; 19 | import { HomePage } from '../pages/home/home'; 20 | import { TabsPage } from '../pages/tabs/tabs'; 21 | import { SigninPage } from '../pages/signin/signin'; 22 | import { SignupPage } from '../pages/signup/signup'; 23 | 24 | @NgModule({ 25 | declarations: [ 26 | MyApp, 27 | AboutPage, 28 | ContactPage, 29 | HomePage, 30 | TabsPage, 31 | SigninPage, 32 | SignupPage 33 | ], 34 | imports: [ 35 | BrowserModule, 36 | IonicModule.forRoot(MyApp) 37 | ], 38 | bootstrap: [IonicApp], 39 | entryComponents: [ 40 | MyApp, 41 | AboutPage, 42 | ContactPage, 43 | HomePage, 44 | TabsPage, 45 | SigninPage, 46 | SignupPage 47 | ], 48 | providers: [ 49 | StatusBar, 50 | SplashScreen, 51 | { provide: ErrorHandler, useClass: IonicErrorHandler }, 52 | ParseProvider, 53 | AuthProvider 54 | ] 55 | }) 56 | export class AppModule { } 57 | -------------------------------------------------------------------------------- /src/app/app.scss: -------------------------------------------------------------------------------- 1 | // http://ionicframework.com/docs/v2/theming/ 2 | 3 | 4 | // App Global Sass 5 | // -------------------------------------------------- 6 | // Put style rules here that you want to apply globally. These 7 | // styles are for the entire app and not just one component. 8 | // Additionally, this file can be also used as an entry point 9 | // to import other Sass files to be included in the output CSS. 10 | // 11 | // Shared Sass variables, which can be used to adjust Ionic's 12 | // default Sass variables, belong in "theme/variables.scss". 13 | // 14 | // To declare rules for a specific mode, create a child rule 15 | // for the .md, .ios, or .wp mode classes. The mode class is 16 | // automatically applied to the element in the app. 17 | 18 | * { 19 | -webkit-font-smoothing: antialiased; 20 | -moz-osx-font-smoothing: grayscale; 21 | } -------------------------------------------------------------------------------- /src/app/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 2 | 3 | import { AppModule } from './app.module'; 4 | 5 | platformBrowserDynamic().bootstrapModule(AppModule); 6 | -------------------------------------------------------------------------------- /src/assets/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/src/assets/icon/favicon.ico -------------------------------------------------------------------------------- /src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/src/assets/images/logo.png -------------------------------------------------------------------------------- /src/assets/images/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/murraco/ionic-parse-server/b7abb0843d9ab8d22161860e4658e7e189750b8b/src/assets/images/placeholder.png -------------------------------------------------------------------------------- /src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Declaration files are how the Typescript compiler knows about the type information(or shape) of an object. 3 | They're what make intellisense work and make Typescript know all about your code. 4 | 5 | A wildcard module is declared below to allow third party libraries to be used in an app even if they don't 6 | provide their own type declarations. 7 | 8 | To learn more about using third party libraries in an Ionic app, check out the docs here: 9 | http://ionicframework.com/docs/v2/resources/third-party-libs/ 10 | 11 | For more info on type definition files, check out the Typescript docs here: 12 | https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html 13 | */ 14 | declare module '*'; -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Ionic App 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Ionic", 3 | "short_name": "Ionic", 4 | "start_url": "index.html", 5 | "display": "standalone", 6 | "icons": [ 7 | { 8 | "src": "assets/images/logo.png", 9 | "sizes": "512x512", 10 | "type": "image/png" 11 | } 12 | ], 13 | "background_color": "#4e8ef7", 14 | "theme_color": "#4e8ef7" 15 | } -------------------------------------------------------------------------------- /src/pages/about/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | About 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 |

14 | This is a simple starter for integrating Ionic 3, Angular 2+ and Parse Server. It provides a small PoC (Proof of Concept) 15 | app for adding/removing scores and uses signin/signout based on Parse Server. You can just use it as the foundation for 16 | your next big app. 17 |

18 |
-------------------------------------------------------------------------------- /src/pages/about/about.scss: -------------------------------------------------------------------------------- 1 | page-about {} 2 | -------------------------------------------------------------------------------- /src/pages/about/about.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { App, NavController } from 'ionic-angular'; 3 | 4 | // Providers 5 | import { AuthProvider } from '../../providers/auth/auth'; 6 | 7 | // Pages 8 | import { SigninPage } from '../signin/signin'; 9 | 10 | @Component({ 11 | selector: 'page-about', 12 | templateUrl: 'about.html' 13 | }) 14 | export class AboutPage { 15 | 16 | constructor(private auth: AuthProvider, private app: App) { } 17 | 18 | ionViewCanEnter(): boolean { 19 | return this.auth.authenticated(); 20 | } 21 | 22 | public signout() { 23 | this.auth.signout().subscribe(() => { 24 | this.app.getRootNav().setRoot(SigninPage); 25 | }); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/pages/contact/contact.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Contact 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Don't hesitate to contact me! 16 | 17 | https://murraco.github.io 18 | 19 | 20 | mauriurraco@gmail.com 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/pages/contact/contact.scss: -------------------------------------------------------------------------------- 1 | page-contact { 2 | 3 | a { 4 | text-decoration: none; 5 | } 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/pages/contact/contact.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { App } from 'ionic-angular'; 3 | 4 | // Providers 5 | import { AuthProvider } from '../../providers/auth/auth'; 6 | 7 | // Pages 8 | import { SigninPage } from '../signin/signin'; 9 | 10 | @Component({ 11 | selector: 'page-contact', 12 | templateUrl: 'contact.html' 13 | }) 14 | export class ContactPage { 15 | 16 | constructor(private auth: AuthProvider, private app: App) { } 17 | 18 | ionViewCanEnter(): boolean { 19 | return this.auth.authenticated(); 20 | } 21 | 22 | public signout() { 23 | this.auth.signout().subscribe(() => { 24 | this.app.getRootNav().setRoot(SigninPage); 25 | }); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/pages/home/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Home 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Add Score 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Current Scores 31 | 32 | 33 |

{{ gameScore.get('playerName') }}

34 |

{{ gameScore.get('score') }}

35 |
36 | 37 |
38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 | -------------------------------------------------------------------------------- /src/pages/home/home.scss: -------------------------------------------------------------------------------- 1 | page-home {} 2 | -------------------------------------------------------------------------------- /src/pages/home/home.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { App } from 'ionic-angular'; 3 | 4 | // Providers 5 | import { ParseProvider } from '../../providers/parse/parse'; 6 | import { AuthProvider } from '../../providers/auth/auth'; 7 | 8 | // Pages 9 | import { SigninPage } from '../signin/signin'; 10 | 11 | @Component({ 12 | selector: 'page-home', 13 | templateUrl: 'home.html' 14 | }) 15 | export class HomePage { 16 | newScore = { playerName: null, score: null }; 17 | gameScores = []; 18 | 19 | constructor(private parseProvider: ParseProvider, private auth: AuthProvider, private app: App) { 20 | this.listScores(); 21 | } 22 | 23 | ionViewCanEnter(): boolean { 24 | return this.auth.authenticated(); 25 | } 26 | 27 | public listScores(): Promise { 28 | let offset = this.gameScores.length; 29 | let limit = 10; 30 | return this.parseProvider.getGameScores(offset, limit).then((result) => { 31 | for (let i = 0; i < result.length; i++) { 32 | let object = result[i]; 33 | this.gameScores.push(object); 34 | } 35 | }, (error) => { 36 | console.log(error); 37 | }); 38 | } 39 | 40 | public postGameScore() { 41 | this.parseProvider.addGameScore(this.newScore).then((gameScore) => { 42 | this.gameScores.push(gameScore); 43 | this.newScore.playerName = null; 44 | this.newScore.score = null; 45 | }, (error) => { 46 | console.log(error); 47 | alert('Error adding score.'); 48 | }); 49 | } 50 | 51 | public signout() { 52 | this.auth.signout().subscribe(() => { 53 | this.app.getRootNav().setRoot(SigninPage); 54 | }); 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/pages/signin/signin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 |
9 | 10 | 11 | 12 | Username 13 | 14 | 15 | 16 | Password 17 | 18 | 19 | 20 |
21 | 22 |

Don't you have an acccount? Signup

23 |
24 | 25 |
26 |
27 | 28 |
-------------------------------------------------------------------------------- /src/pages/signin/signin.scss: -------------------------------------------------------------------------------- 1 | page-signin { 2 | 3 | .logo { 4 | text-align: center; 5 | img { 6 | margin-top: 50px; 7 | margin-bottom: 20px; 8 | width: 50%; 9 | } 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/pages/signin/signin.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NavController, LoadingController } from 'ionic-angular'; 3 | 4 | // Providers 5 | import { AuthProvider } from '../../providers/auth/auth'; 6 | 7 | // Pages 8 | import { SignupPage } from '../signup/signup'; 9 | import { TabsPage } from '../tabs/tabs'; 10 | 11 | @Component({ 12 | selector: 'page-signin', 13 | templateUrl: 'signin.html' 14 | }) 15 | export class SigninPage { 16 | registerPage = SignupPage; 17 | password: string = ''; 18 | username: string = ''; 19 | 20 | constructor(public navCtrl: NavController, private loadCtrl: LoadingController, private authPvdr: AuthProvider) { } 21 | 22 | ionViewDidLoad() { 23 | console.log('Initiated Signin'); 24 | } 25 | 26 | public doSignin() { 27 | let loader = this.loadCtrl.create({ 28 | content: 'Signing in...' 29 | }); 30 | loader.present(); 31 | 32 | this.authPvdr.signin(this.username, this.password).subscribe((success) => { 33 | this.navCtrl.setRoot(TabsPage); 34 | loader.dismissAll(); 35 | }, (error) => { 36 | alert('Invalid username or password'); 37 | loader.dismissAll(); 38 | }); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/pages/signup/signup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Signup 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | Username 14 | 15 | 16 | 17 | Password 18 | 19 | 20 | 21 | Verify Password 22 | 23 | 24 | 25 | Email 26 | 27 | 28 | 29 |
30 | 31 |
32 | 33 |
34 |
35 | 36 |
37 | -------------------------------------------------------------------------------- /src/pages/signup/signup.scss: -------------------------------------------------------------------------------- 1 | page-signup { 2 | ::-webkit-scrollbar, 3 | *::-webkit-scrollbar { 4 | display: none; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/pages/signup/signup.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NavController, LoadingController } from 'ionic-angular'; 3 | 4 | // Providers 5 | import { AuthProvider } from '../../providers/auth/auth'; 6 | 7 | // Pages 8 | import { TabsPage } from '../tabs/tabs'; 9 | 10 | @Component({ 11 | selector: 'page-signup', 12 | templateUrl: 'signup.html' 13 | }) 14 | export class SignupPage { 15 | password: string = ''; 16 | username: string = ''; 17 | verify: string = ''; 18 | email: string = ''; 19 | 20 | constructor(public navCtrl: NavController, private authPvdr: AuthProvider, private loadCtrl: LoadingController) { } 21 | 22 | ionViewDidLoad() { 23 | console.log('Initiate Signup'); 24 | } 25 | 26 | // TODO: form validation 27 | public doRegister() { 28 | let loader = this.loadCtrl.create({ 29 | content: 'Signing up...' 30 | }); 31 | loader.present(); 32 | 33 | this.authPvdr.signup(this.username, this.password, this.email).subscribe((success) => { 34 | this.navCtrl.setRoot(TabsPage); 35 | loader.dismissAll(); 36 | }, (error) => { 37 | loader.dismissAll(); 38 | }); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/pages/tabs/tabs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/pages/tabs/tabs.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | // Providers 4 | import { AuthProvider } from '../../providers/auth/auth'; 5 | 6 | // Pages 7 | import { AboutPage } from '../about/about'; 8 | import { ContactPage } from '../contact/contact'; 9 | import { HomePage } from '../home/home'; 10 | 11 | @Component({ 12 | templateUrl: 'tabs.html' 13 | }) 14 | export class TabsPage { 15 | tab1Root = HomePage; 16 | tab2Root = AboutPage; 17 | tab3Root = ContactPage; 18 | 19 | constructor(private auth: AuthProvider) { } 20 | 21 | ionViewCanEnter(): boolean { 22 | return this.auth.authenticated(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/providers/auth/auth.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Observable } from 'rxjs/Observable'; 3 | import 'rxjs/add/operator/map'; 4 | 5 | // Parse 6 | import { Parse } from 'parse'; 7 | 8 | // Constants 9 | import { ENV } from '../../app/app.constant'; 10 | 11 | export class User { 12 | public id: string; 13 | public name: string; 14 | public email: string; 15 | } 16 | 17 | @Injectable() 18 | export class AuthProvider { 19 | private parseAppId: string = ENV.parseAppId; 20 | private parseServerUrl: string = ENV.parseServerUrl; 21 | 22 | constructor() { 23 | this.parseInitialize(); 24 | console.log('Initiated Auth'); 25 | } 26 | 27 | public signin(username: string, password: string): Observable { 28 | return new Observable((observer) => { 29 | Parse.User.logIn(username, password, { 30 | success: function (user) { 31 | observer.next(true); 32 | observer.complete(); 33 | }, 34 | error: function (user, error) { 35 | // If the user inputs the email instead of the username 36 | var userQuery = new Parse.Query(Parse.User); 37 | 38 | userQuery.equalTo('email', username); 39 | userQuery.first().then(function (success) { 40 | var username = success.toJSON().username; 41 | Parse.User.logIn(username, password, { 42 | success: function (user) { 43 | observer.next(true); 44 | observer.complete(); 45 | }, 46 | error: function (user, error) { 47 | observer.error(error); 48 | observer.complete(); 49 | } 50 | }); 51 | }, function (error) { 52 | observer.error(error); 53 | observer.complete(); 54 | }); 55 | 56 | } 57 | }); 58 | }); 59 | } 60 | 61 | public signup(username: string, password: string, email: string): Observable { 62 | return new Observable((observer) => { 63 | var user = new Parse.User(); 64 | user.set('username', username); 65 | user.set('password', password); 66 | user.set('email', email); 67 | 68 | user.signUp(null, { 69 | success: (user) => { 70 | observer.next(true); 71 | observer.complete(); 72 | }, 73 | error: (user, error) => { 74 | observer.error(error); 75 | observer.complete(); 76 | } 77 | }); 78 | 79 | }); 80 | } 81 | 82 | public signout(): Observable { 83 | return new Observable((observer) => { 84 | Parse.User.logOut().then(() => observer.next(true)); 85 | }); 86 | } 87 | 88 | public currentUser(): User { 89 | let u = Parse.User.current(); 90 | if (u) { 91 | var user = new User(); 92 | user.id = u.id; 93 | user.name = u.get('username'); 94 | user.email = u.get('email'); 95 | return user; 96 | } 97 | return null 98 | } 99 | 100 | public authenticated(): boolean { 101 | return this.currentUser() !== null; 102 | } 103 | 104 | private parseInitialize() { 105 | Parse.initialize(this.parseAppId); 106 | Parse.serverURL = this.parseServerUrl; 107 | } 108 | 109 | } 110 | -------------------------------------------------------------------------------- /src/providers/parse/parse.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import 'rxjs/add/operator/map'; 3 | 4 | // Parse 5 | import { Parse } from 'parse'; 6 | 7 | // Constants 8 | import { ENV } from '../../app/app.constant'; 9 | 10 | @Injectable() 11 | export class ParseProvider { 12 | private parseAppId: string = ENV.parseAppId; 13 | private parseServerUrl: string = ENV.parseServerUrl; 14 | 15 | constructor() { 16 | this.parseInitialize(); 17 | console.log('Initiated Parse'); 18 | } 19 | 20 | public getGameScores(offset: number = 0, limit: number = 3): Promise { 21 | return new Promise((resolve, reject) => { 22 | setTimeout(() => { 23 | const GameScore = Parse.Object.extend('GameScore'); 24 | let query = new Parse.Query(GameScore); 25 | query.skip(offset); 26 | query.limit(limit); 27 | query.find().then((gameScores) => { 28 | resolve(gameScores); 29 | }, (error) => { 30 | reject(error); 31 | }); 32 | }, 500); 33 | }); 34 | } 35 | 36 | public addGameScore(newScore): Promise { 37 | const GameScore = Parse.Object.extend('GameScore'); 38 | 39 | let gameScore = new GameScore(); 40 | gameScore.set('score', parseInt(newScore.score)); 41 | gameScore.set('playerName', newScore.playerName); 42 | gameScore.set('cheatMode', false); 43 | 44 | return gameScore.save(null, { 45 | success: function (gameScore) { 46 | console.log(gameScore); 47 | return gameScore; 48 | }, 49 | error: function (gameScore, error) { 50 | console.log(error); 51 | return error; 52 | } 53 | }); 54 | } 55 | 56 | private parseInitialize() { 57 | Parse.initialize(this.parseAppId); 58 | Parse.serverURL = this.parseServerUrl; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/service-worker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Check out https://googlechrome.github.io/sw-toolbox/ for 3 | * more info on how to use sw-toolbox to custom configure your service worker. 4 | */ 5 | 6 | 7 | 'use strict'; 8 | importScripts('./build/sw-toolbox.js'); 9 | 10 | self.toolbox.options.cache = { 11 | name: 'ionic-cache' 12 | }; 13 | 14 | // pre-cache our key assets 15 | self.toolbox.precache( 16 | [ 17 | './build/main.js', 18 | './build/main.css', 19 | './build/polyfills.js', 20 | 'index.html', 21 | 'manifest.json' 22 | ] 23 | ); 24 | 25 | // dynamically cache any other local assets 26 | self.toolbox.router.any('/*', self.toolbox.cacheFirst); 27 | 28 | // for any other requests go to the network, cache, 29 | // and then only use that cached resource if your user goes offline 30 | self.toolbox.router.default = self.toolbox.networkFirst; 31 | -------------------------------------------------------------------------------- /src/theme/variables.scss: -------------------------------------------------------------------------------- 1 | // Ionic Variables and Theming. For more info, please see: 2 | // http://ionicframework.com/docs/v2/theming/ 3 | $font-path: "../assets/fonts"; 4 | 5 | @import "ionic.globals"; 6 | 7 | 8 | // Shared Variables 9 | // -------------------------------------------------- 10 | // To customize the look and feel of this app, you can override 11 | // the Sass variables found in Ionic's source scss files. 12 | // To view all the possible Ionic variables, see: 13 | // http://ionicframework.com/docs/v2/theming/overriding-ionic-variables/ 14 | 15 | 16 | 17 | 18 | // Named Color Variables 19 | // -------------------------------------------------- 20 | // Named colors makes it easy to reuse colors on various components. 21 | // It's highly recommended to change the default colors 22 | // to match your app's branding. Ionic uses a Sass map of 23 | // colors so you can add, rename and remove colors as needed. 24 | // The "primary" color is the only required color in the map. 25 | 26 | $colors: ( 27 | primary: #3F51B5, 28 | primary-light: #C5CAE9, 29 | primary-dark: #303F9F, 30 | primary-text: #212121, 31 | secondary-text: #757575, 32 | accent: #FF5252, 33 | divider: #BDBDBD 34 | ); 35 | 36 | 37 | // App iOS Variables 38 | // -------------------------------------------------- 39 | // iOS only Sass variables can go here 40 | 41 | 42 | 43 | 44 | // App Material Design Variables 45 | // -------------------------------------------------- 46 | // Material Design only Sass variables can go here 47 | 48 | 49 | 50 | 51 | // App Windows Variables 52 | // -------------------------------------------------- 53 | // Windows only Sass variables can go here 54 | 55 | 56 | 57 | 58 | // App Theme 59 | // -------------------------------------------------- 60 | // Ionic apps can have different themes applied, which can 61 | // then be future customized. This import comes last 62 | // so that the above variables are used and Ionic's 63 | // default are overridden. 64 | 65 | @import "ionic.theme.default"; 66 | 67 | 68 | // Ionicons 69 | // -------------------------------------------------- 70 | // The premium icon font for Ionic. For more info, please see: 71 | // http://ionicframework.com/docs/v2/ionicons/ 72 | 73 | @import "ionic.ionicons"; 74 | 75 | 76 | // Fonts 77 | // -------------------------------------------------- 78 | 79 | @import "roboto"; 80 | @import "noto-sans"; 81 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "declaration": false, 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "lib": [ 8 | "dom", 9 | "es2015" 10 | ], 11 | "module": "es2015", 12 | "moduleResolution": "node", 13 | "sourceMap": true, 14 | "target": "es5" 15 | }, 16 | "include": [ 17 | "src/**/*.ts" 18 | ], 19 | "exclude": [ 20 | "node_modules" 21 | ], 22 | "compileOnSave": false, 23 | "atom": { 24 | "rewriteTsconfig": false 25 | } 26 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-duplicate-variable": true, 4 | "no-unused-variable": [ 5 | true 6 | ] 7 | }, 8 | "rulesDirectory": [ 9 | "node_modules/tslint-eslint-rules/dist/rules" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /typings/cordova-typings.d.ts: -------------------------------------------------------------------------------- 1 | 2 | /// 3 | /// 4 | /// --------------------------------------------------------------------------------