Quantcast
Channel: Ionic Framework - Ionic Forum
Viewing all 49253 articles
Browse latest View live

ITMS-90809: Deprecated API Usage - still there :(

$
0
0

Hallo there,

I have a Ionic v3 Project.
I want to upload a new version of the app. So, i’ve done all the Steps for WKWebView integration.
But still the same error.
Steps i made:

  • update cordova ios to 5.1.1
  • update cordova plugins (include inappbrowser) to the latest versions
  • add a tag (WKWebViewOnly value=“true”) to the projects config.xml
  • remove platform and add it again

When i open xCode and search for “UIWebView” it shows:

  • the CordovaLib.xcodeproj
  • FirAuth (Firebase librarys)

I waste so much time and go crazy with it
Everytime i upload the app on xcode to the store i’ll get the warning and cant use it on itunes connect

1 post - 1 participant

Read full topic


Slack Deactivated account

$
0
0

Hi there, Where to find Slack workspace owner? my account in slack was deactivated, i want to reinstate my account.

Thanks

1 post - 1 participant

Read full topic

How to disable swipe-to-go-back gesture on one page only? (Ionic v5 React)

$
0
0

Does anyone know if there’s a way to disable the iOS swipe-to-go-back gesture on just one page in Ionic React? Or, how to do it programmatically?

I know you can disable it globally using the method in the docs here (i.e. setupConfig), but that method affects all pages and seems to only be runnable once as the app starts up.

Also, I know this is easy to do in an Angular app—just inject IonRouterOutlet and set swipeGesture to true/false when entering/leaving the page (see SO answer / forum answer). I need an equivalent solution for React, if it exists. There doesn’t seem to be any documentation on it at the moment.

Thanks in advance.

1 post - 1 participant

Read full topic

HTTP interceptor causing CORS issue using ionic/angular

$
0
0

here i am using ionic for web and mobile also and i am using a https url while integrating it i got cors issues .Later when i checked after removing the http interceptor cors issue is resolved but how can i solve this issue below is my code

issues: While using interceptor i am getting CORS issue and if i remove interceptor it is working fine.

export class HttpConfigInterceptor implements HttpInterceptor {
    token:any;

    constructor(public storage: Storage ) { 
        this.storage.get('Token').then(data => {
            this.token = data;
        });
    }


    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        //Authentication by setting header with token value
        if (this.token) {
            request = request.clone({
                setHeaders: {
                    Authorization: this.token
                }
            });
        }

        if (!request.headers.has('Content-Type')) {
            request = request.clone({
                setHeaders: {
                    'content-type': 'application/json'
                }
            });
        }

        request = request.clone({
            headers: request.headers.set('Accept', 'application/json')
        });

        return next.handle(request).pipe(
            map((event: HttpEvent<any>) => {
                if (event instanceof HttpResponse) {
                   
                }
                return event;
            }),
            catchError((error: HttpErrorResponse) => {
                console.error(error);
                return throwError(error);
            }));
    }


}

1 post - 1 participant

Read full topic

Advice needed on migration strategy from ionic 3 to ionic 5 ( and preferably cordova to capacitor )

$
0
0

We have a fairly complex application which uses a lot of custom plugins - it’s currently running on ionic 3 ( cordova, angular, and all the stuff that was relevant back when ionic 3 was fresh ) . It would be final time to make the leap to ionic 5 and I was wondering if there is a good strategy how to start? There’s a lot of code, lot of plugins used and a lot of npm libs involved … so any advice is much appreciated.

Thanks!

1 post - 1 participant

Read full topic

Can We Use Ionic 3 Segemnt In Ionic4?

$
0
0

*Can we use the ionic 3 segments in the ionic 4 projects? is it bad?

<ion-segment [(ngModel)]="boxes">
  <ion-segment-button value="box1">
    Box 1
  </ion-segment-button>
  <ion-segment-button value="box2">
    Box 2
  </ion-segment-button>

</ion-segment>
<div *ngSwitchCase="'box1'">

  <p>hi its box 1</p>

</div>



<div *ngSwitchCase="'box2'">
  <p>hi its box 2</p>

</div>

1 post - 1 participant

Read full topic

ionic windows uwp blank screen

$
0
0

0

I’m trying to get my ionic 4 app to work on windows, but all I get is a blank screen.

I tried to put a console log on the beginning of my index.html and it shows up. The angular root html tag is empty so the problem is not the splashscreen staying on screen. I tried the solution everyone give with replacing <base href="/" /> with <base href="./" /> in index.html and it’s not working.

My app works fine in android and ios.

I get two error in the logs in vendor.js that I completely don’t understand.

TypeError: Unable to get property 'define' of undefined or null reference
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/vendor.js:106341:1841)
   at Array.prototype.forEach (native code)
   at t (ms-appx-web://myApp.fffffffff/www/vendor.js:106341:1821)
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/vendor.js:106341:1808)
   at ZoneDelegate.prototype.invoke (ms-appx-web://myApp.fffffffff/www/polyfills.js:2735:13)
   at onInvoke (ms-appx-web://myApp.fffffffff/www/vendor.js:65554:17)
   at ZoneDelegate.prototype.invoke (ms-appx-web://myApp.fffffffff/www/polyfills.js:2735:13)
   at Zone.prototype.run (ms-appx-web://myApp.fffffffff/www/polyfills.js:2495:17)
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/polyfills.js:3255:17)
   at ZoneDelegate.prototype.invokeTask (ms-appx-web://myApp.fffffffff/www/polyfills.js:2767:13)
main.js (13895,13)

and the second one

Unhandled Promise rejection: Unable to get property 'apply' of undefined or null reference ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Unable to get property 'apply' of undefined or null reference TypeError: Unable to get property 'apply' of undefined or null reference
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/vendor.js:105260:19)
   at ZoneDelegate.prototype.invoke (ms-appx-web://myApp.fffffffff/www/polyfills.js:2735:13)
   at Zone.prototype.run (ms-appx-web://myApp.fffffffff/www/polyfills.js:2495:17)
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/polyfills.js:3255:17)
   at ZoneDelegate.prototype.invokeTask (ms-appx-web://myApp.fffffffff/www/polyfills.js:2767:13)
   at Zone.prototype.runTask (ms-appx-web://myApp.fffffffff/www/polyfills.js:2540:21)
   at drainMicroTaskQueue (ms-appx-web://myApp.fffffffff/www/polyfills.js:2946:25)
polyfills.js (3048,17)
   "Unhandled Promise rejection:"
   "Unable to get property 'apply' of undefined or null reference"
   "; Zone:"
   "<root>"
   "; Task:"
   "Promise.then"
   "; Value:"
   {
      [functions]: ,
      __proto__: { },
      description: "Unable to get property 'apply' of undefined or null reference",
      message: "Unable to get property 'apply' of undefined or null reference",
      name: "TypeError",
      number: -2146823281,
      stack: "TypeError: Unable to get property 'apply' of undefined or null reference
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/vendor.js:105260:19)
   at ZoneDelegate.prototype.invoke (ms-appx-web://myApp.fffffffff/www/polyfills.js:2735:13)
   at Zone.prototype.run (ms-appx-web://myApp.fffffffff/www/polyfills.js:2495:17)
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/polyfills.js:3255:17)
   at ZoneDelegate.prototype.invokeTask (ms-appx-web://myApp.fffffffff/www/polyfills.js:2767:13)
   at Zone.prototype.runTask (ms-appx-web://myApp.fffffffff/www/polyfills.js:2540:21)
   at drainMicroTaskQueue (ms-appx-web://myApp.fffffffff/www/polyfills.js:2946:25)"
   }
   "TypeError: Unable to get property 'apply' of undefined or null reference
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/vendor.js:105260:19)
   at ZoneDelegate.prototype.invoke (ms-appx-web://myApp.fffffffff/www/polyfills.js:2735:13)
   at Zone.prototype.run (ms-appx-web://myApp.fffffffff/www/polyfills.js:2495:17)
   at Anonymous function (ms-appx-web://myApp.fffffffff/www/polyfills.js:3255:17)
   at ZoneDelegate.prototype.invokeTask (ms-appx-web://myApp.fffffffff/www/polyfills.js:2767:13)
   at Zone.prototype.runTask (ms-appx-web://myApp.fffffffff/www/polyfills.js:2540:21)
   at drainMicroTaskQueue (ms-appx-web://myApp.fffffffff/www/polyfills.js:2946:25)"

I don’t know if it’s these errors that cause my app to stay blank and not launching angular, still at the end of the logs I get the “Ionic Native: deviceready event fired after 4704 ms”

any ideas ?

1 post - 1 participant

Read full topic

java.lang.OutOfMemoryError

$
0
0

Hi everyone,
our app downloads several files locally to make them available offline.
It often happens that the app closes with this error in the console.

java.lang.OutOfMemoryError: Failed to allocate a 268435472 byte allocation with 25165824 free bytes and 96MB until OOM, max allowed footprint 460932552, growth limit 536870912

We have already tried to modify the manifest but we have not achieved great results.
Is there a way to configure infinite memory usage?
Do you have a solution to this problem?

2 posts - 2 participants

Read full topic


Detect picture from camera or gallery

$
0
0

Hi, i am using ionic plugin camera but it can be replaced by using app such as “GalleryCam” so the picture is from phone gallery instead of real camera device, if you have any solution please share

Thanks

1 post - 1 participant

Read full topic

External JS library resolves in browser but not on android device

$
0
0

I’m dependent on an external JS library for my project (BrowserPrint)
I tried importing the minified javascript files trough angular.json

"scripts": [
    "./node_modules/zebra/BrowserPrint-3.0.216.min.js",
    "./node_modules/zebra/BrowserPrint-Zebra-1.0.216.min.js",
    "./node_modules/zebra/external.js"
 ],

As you can see i added a simple external.js file myself to make sure that the files are picked up correctly.
To be more precise, the code contained by the external.js file contains the following code:

function ExternalJsFunction() {
    alert('hi');
}

when I import both libraries in my component as follows (BrowserPrint is a declared variable in the minified browserprint javascript file):

declare var BrowserPrint;
declare var ExternalJsFunction;

I am able to use the ExternalJSFunction in both the webapp (Ionic serve) and the (emulated) Android app (ionic cordova emulate android)
The problem is that the BrowserPrint variable is recognised in the webapp (Ionic serve) but NOT in the (emulated) Android app (ionic cordova emulate endroid).

Console logged as (emulated Android):

console.log('i am browserprint', BrowserPrint);

Results in:

[console.log]: "i am browserprint" {}

In the webapp (ionic serve) this works just fine.
Is there any reason why this particular JS library would load correctly in the webapp but not on Android?

Any help is much appreciated!

2 posts - 2 participants

Read full topic

How to validate JWT access token from mobile app?

$
0
0

I’m using MS Adal plugins for a Ionic3 project and its validate user from azure. Now, If I follow the below steps,

  1. Logged in the app after the sso validation and close the app.
  2. I change the password from a web browser.
  3. Now, I again open the app.

then, the app is opening without validating the JWT access token.

For a browser, the browser itself do all the validation for SSO authentication. We don’t need to remember the accessToken in the application. But a mobile app is standalone application.

So, is there a way to validate and renew the JWT access token for mobile app? OR could I validate and renew the JWT access token via dot net api?

1 post - 1 participant

Read full topic

How to pass storage (User session) data to side menu ionic 5?

$
0
0

i am new in ionic and started from youtube tutorials , i created a crud in ionic using PHP, my sql in success login i redirect to home page and by using home.page.ts i can get storage data in home.page.html, but i am not able to pass user storage data in side menu to show user name in side menu, i tried in app. component. ts to get storage data and pass to side menu which html is in app. component. html but its not showing on first login but after login when i refresh it shows name that’s because it is added storage else condition in app. component. ts i even added that method in after ready but still no luck i need help on this pls.

======================================================================

app.component.ts

import { Platform } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';

import { Storage } from '@ionic/storage';
import { NavController } from '@ionic/angular';

@Component({
  selector: 'app-root',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.scss']
})
export class AppComponent {

  datastorage: any;
  patient_name: string;
  patient_no: string;

  constructor(
    private platform: Platform,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar,
    private storage: Storage,
    public navCtrl: NavController
  ) {
    this.initializeApp();
  }

  initializeApp() {
    this.platform.ready().then(() => {
      this.statusBar.styleDefault();
      this.splashScreen.hide();
      
       this.storage.get('storage_xxx').then((res)=>{
             if(res==null)
             {
               this.navCtrl.navigateRoot('/login');
             }
             else
             {
               console.log(res);
              this.datastorage=res;
              this.patient_name = this.datastorage.patient_name;
              this.patient_no = this.datastorage.patient_no;
              this.navCtrl.navigateRoot('/home');
             }
        });
      
    });

   this.storage.get('storage_xxx').then((res)=>{
     if(res==null)
     {
       this.navCtrl.navigateRoot('/login');
     }
     else
     {
       console.log(res);
      this.datastorage=res;
      this.patient_name = this.datastorage.patient_name;
      this.patient_no = this.datastorage.patient_no;
      this.navCtrl.navigateRoot('/home');
     }
   });

  }
}

app.component.html

<ion-app>
  <ion-menu menuId="main-menu" contentId="main">
    <ion-content>
     <div class="menu-header-bg"></div>
     <div class="header-content">
       <img src="../assets/images/avatar.jpeg" alt="">
       <ion-label>
         <h2>{{patient_name}}</h2>
         <p>Num: {{patient_no}}</p>
       </ion-label>
     </div>
     <div class="action-button">
       <ion-button>
          <ion-icon slot="start" name="add"></ion-icon>Add Branch
        </ion-button>
     </div>
     <ion-list lines="none" class="menu-items">
      <ion-item>
        <ion-icon name="home"></ion-icon> Dashboard
      </ion-item>
       <ion-item>
         <ion-icon name="browsers-outline"></ion-icon> Post Session
       </ion-item>
       <ion-item class="active">
        <ion-icon name="flash"></ion-icon> Live Session
      </ion-item>
      <ion-item>
        <ion-icon name="heart-outline"></ion-icon> Library
      </ion-item>
      <ion-item>
        <ion-icon name="chatbubble-ellipses-outline"></ion-icon> Message
      </ion-item>
      <ion-item>
        <ion-icon name="exit-outline"></ion-icon> Sign Out
      </ion-item>
     </ion-list>
    </ion-content>
  </ion-menu>
  <ion-router-outlet id="main"></ion-router-outlet>
</ion-app>

login.page.ts

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { ToastController, LoadingController, AlertController, NavController } from '@ionic/angular';
import { AccessProviders } from '../../providers/access-providers';
import { Storage } from '@ionic/storage';
import { resolve } from 'dns';
import { promise } from 'protractor';

@Component({
  selector: 'app-login',
  templateUrl: './login.page.html',
  styleUrls: ['./login.page.scss'],
})
export class LoginPage implements OnInit {

  user_login_name: string="";
  login_password: string="";

  disabledButton;

  constructor(
    private router : Router,
    private toastCtrl : ToastController,
    private loadingCtrl : LoadingController,
    private alertCtrl : AlertController,
    private accessPrvds : AccessProviders,
    private storage: Storage,
    public navCtrl: NavController
  ) { }

  ngOnInit() {
  }

  ionViewDidEnter()
  {
    this.disabledButton=false;
  }

  openRegister()
  {
    this.router.navigate(['/register']);
  }

  async tryLogin()
  {
   if(this.user_login_name==""){
      this.presentToast("Username is required");
    }
    else if(this.login_password==""){
      this.presentToast("Password is required");
    }
    else{
      this.disabledButton=true;
      const loader = await this.loadingCtrl.create({
        message:"Please wait...",
      });
      loader.present();

      return new Promise(resolve=>{

        let body = {
          aksi : "process_login",
          user_login_name: this.user_login_name,
          login_password: this.login_password,
        }

        this.accessPrvds.postData(body, 'process_api.php').subscribe((res:any) => {
            if(res.success==true)
            {
              //console.log(res.result);
              loader.dismiss();
              this.disabledButton=false;
              this.presentToast('Login successfull');
              this.storage.set('storage_xxx',res.result); // store session data
              this.navCtrl.navigateRoot(['/home']);
            }
            else
            {
              loader.dismiss();
              this.disabledButton=false;
              this.presentToast('Username or password is wrong');
            }
        }, (err)=>{
              loader.dismiss();
              this.disabledButton=false;
              this.presentToast('Timeout!');
        });

      });

    }
  }

  async presentToast(a)
  {
    const toast = await this.toastCtrl.create({
      message:a,
      duration:1500
    });
    toast.present();
  }

  async presentLoader(a)
  {
    const loader = await this.loadingCtrl.create({
      message:"Please wait...",
    });
    loader.present();
  }

  async presentAlert(a) {
    const alert = await this.alertCtrl.create({
      header: a,
      backdropDismiss: false,
      buttons: [
        {
          text: 'Close',
          handler: (blah) => {
            console.log('Confirm Cancel: blah');
          }
        }, {
          text: 'Try Again',
          handler: () => {
            this.tryLogin();
          }
        }
      ]
    });

    await alert.present();
  }

}

1 post - 1 participant

Read full topic

How to update or refresh Picker column

$
0
0

Hi, my picker (Ionic 5 Angular), have columns that has relationship each other, i’m using ionPickerColChange event to avoid dependance like so:

picker.addEventListener('ionPickerColChange', async (event: any) => {
let data: PickerColumn = event.detail;
      if (data.name == "Products") {
        let selectedProduttore: PickerColumnOption = data.options.find(p => p.selected == true);
        let columnProdotti: PickerColumn = this.dependentColumnsGlobal.find(p => p.name == "Products");
        selectedProduttore.value));
        let columnsOptsProdottiUpdated = columnProdotti.options.filter(p => p.value.idSoftwareHouseProvenienza == selectedProduttore.value);
        columnsOptsProdottiUpdated[0].selected = true;
        columnProdotti.options = columnsOptsProdottiUpdated;
        picker.columns[1] = columnProdotti;
}

My problem is that picker doens’t refresh after i set column. If i close and reopen picker i can see colum update…How to refresh picker? In Ionic 4 there was forceUpdate but in Ionic 5 is deprecated.

1 post - 1 participant

Read full topic

Ionic WkWebView images not rendering

$
0
0

Images that I took from the camera of am trying to upload from the gallery is not being rendered in the ios application. I have tried all the things like normalizingURL and this.win.Ionic.WebView.convertFileSrc these are not working as well.

Do I need to make any changes to the config.xml file so that the image will be rendered in my view??

1 post - 1 participant

Read full topic

Add a title to buttons

$
0
0

Hello, I am new to ionic. I wanted to know how to pass a property so that the button has a description

export const ButtonExample: React.FC = () => (
  <IonContent>

    <IonButton shape="round">{this.prop.title}</IonButton>

  </IonContent>
);

and then:

    <ButtonExample title="New account"></ButtonExample>

But that gives me an error.

1 post - 1 participant

Read full topic


Menu: must have a “content” element to listen for drag events on

$
0
0

I created a menu component which has the menu-button and the ion-menu inside because i want to use this component on multiple pages. To use this component on different pages, i created a module with the menu component inside which than gets imported on every page that should have the menu.
When accessing the page i get the error

Menu: must have a "content" element to listen for drag events on

app.component.html

<ion-app>
    <ion-router-outlet id="main-menu"></ion-router-outlet>
</ion-app>

menu.component.html

<div id="menu-button" (click)="this.toggleMenu()">
	<span></span>
	<span></span>
	<span></span>
</div>
<ion-menu side="start" contentId="main-menu" menuId="main-menu">
	<ion-content>
		<ion-menu-toggle auto-hide="false">
			<ion-list lines="none">
				<ion-item [routerLink]="'/list-view'">
					<ion-icon name="list-outline" slot="start"></ion-icon>
					{{ 'PAGES.LISTVIEW.LISTVIEW' | translate }}
				</ion-item>
				<ion-item [routerLink]="'/settings'">
					<ion-icon name="list-outline" slot="start"></ion-icon>
					{{ 'PAGES.SETTINGS.PKEY' | translate }}
				</ion-item>
				<ion-item (click)="logout()">
					<ion-icon name="log-out-outline" slot="start"></ion-icon>
					{{ 'PAGES.LOGIN.LOGOUT' | translate }}
				</ion-item>
			</ion-list>
		</ion-menu-toggle>
	</ion-content>
</ion-menu>

2 posts - 2 participants

Read full topic

Ionic 5 start app - React based one doesn't work as chrome extension, but Angular does

$
0
0

Hi,

I’m facing problem when Angular based starter app works fine as chrome extension, but
same React-based shows blank screen, but no errors found in extension console, also expected DOM structure exists.

Also regular browser app works fine (serve -s build).

Steps to reproduce:

  1. ionic start ionic_ext blank --type=react
  2. replace ./ionic_ext/public/manifest.json with relaxed extension manifest:
{
  "manifest_version": 2,
  "name": "Hello Ionic Ext",
  "description" : "Hello Ionic Ext Demo",
  "version": "1.0",
  "browser_action": {
    "default_popup": "index.html",
    "default_icon": "assets/icon/icon.png"
  },
  "permissions": ["http://localhost/*"],
  
  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"
}
  1. Add next snippet to ./ionic_ext/public/index.html head:
    <style type="text/css">
    body {
      overflow: hidden;
      min-width: 600px;
      max-width: auto;
      width: 600px;
    }
    html {
      overflow: hidden;
      min-width: 600px;
      max-width: auto;
      min-height: 700px;
      height: 700px;
    }
  </style>
  1. ionic build --engine=browser
  2. Load unpacked extension from ./ionic_ext/public/build

Result: when activating popup I can see just blank screen. Inspect shows no console errors, DOM looks fine.

My package versions:

ionic 6.11.8
node  12.9.1
chrome 85.0.4183.102 (Official Build) (64-bit)

OS:  Ubuntu 19.10   x86_64 x86_64 GNU/Linux

Already spent 2 days for that… no luck…

1 post - 1 participant

Read full topic

Which to use? Angular or Ionic

$
0
0

I’ve been very confused since the release of Capacitor 2, and I wish to create web+mobile apps at the same time.

  1. Since I can create a web app with Angular and then easily add capacitor 2 to make it a mobile.

  2. Or I can do a ionic app to create a website + mobile.

Not really sure the pros and const of these 2 options are.

Thanks for your thoughts!

1 post - 1 participant

Read full topic

Ionic v5 - Is it posible to cache/reuse Modal for multiple uses?

$
0
0

Scenario:

we have a list of items, when i click one of them, the modal is opened to show the details of the item.

Issue:

On slow phones there is a delay (about 2-3 seconds) between the click and the modal actually being shown.

How to reproduce:

  1. go to: https://ionicframework.com/docs/api/modal
  2. open the chrome developer tools (F12)
  3. clic on the “Performance” tab.
  4. set the CPU throttling to “4x slowdown” or “6x slowndown”.

image

  1. Clic on the “Show Modal” of the page (open and close several times, every time will be a delay)

image

So my question is. Is there any way to avoid the modal to be created and destroyed every time? Since i know that it will be used multiple time with the same template (component), can i cached it to be reused and save the time that takes create it again and again?

Thanks!

1 post - 1 participant

Read full topic

Trying out both Vuelidate & Vee-Validate, Form and Form Validation Libraries, In the New Vue3 Release

$
0
0

Sample app showing vue3 and Ionic Framework form validation examples with Vuelidate & Vee-Validate, both are in early release, but wanted to git it a try.

Wanted to see how they would function with Ionic Vue web components.

I think that Vuelidate integration was abit more straightforward. Will dig alittle deeper with nested forms in the next sample and then add a video

Ionic-vue-validation-app: https://buff.ly/3crnsks
Vue3 Ionic Videos: https://www.youtube.com/playlist?list=PL2PY2-9rsgl2uKW0DB5FJ-YRCAG-JuSWN

1 post - 1 participant

Read full topic

Viewing all 49253 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>