TryGhost/Ghost

View on GitHub
ghost/admin/app/components/gh-facebook-url-input.js

Summary

Maintainability
A
2 hrs
Test Coverage
import Component from '@glimmer/component';
import validator from 'validator';
import {action} from '@ember/object';

export default class GhFacebookUrlInput extends Component {
    get value() {
        const {model, modelProperty, scratchValue} = this.args;
        return scratchValue || model[modelProperty];
    }

    @action
    setScratchValue(event) {
        this.args.setScratchValue?.(event.target.value);
    }

    @action
    setFacebookUrl(event) {
        const {model, modelProperty} = this.args;

        let newUrl = event.target.value;

        // reset errors and validation
        model.errors.remove('facebook');
        model.hasValidated.removeObject('facebook');

        if (!newUrl) {
            // Clear out the Facebook url
            model[modelProperty] = null;
            this.args.setScratchValue?.(null);
            return;
        }

        try {
            // strip any facebook URLs out
            newUrl = newUrl.replace(/(https?:\/\/)?(www\.)?facebook\.com/i, '');

            // don't allow any non-facebook urls
            if (newUrl.match(/^(http|\/\/)/i)) {
                throw 'invalid url';
            }

            // strip leading / if we have one then concat to full facebook URL
            newUrl = newUrl.replace(/^\//, '');
            newUrl = `https://www.facebook.com/${newUrl}`;

            // don't allow URL if it's not valid
            if (!validator.isURL(newUrl)) {
                throw 'invalid url';
            }

            model[modelProperty] = newUrl;
            this.args.setScratchValue?.(null);
        } catch (e) {
            if (e === 'invalid url') {
                const message = 'The URL must be in a format like https://www.facebook.com/yourPage';
                model.errors.add('facebook', message);
                return;
            }

            throw e;
        } finally {
            model.hasValidated.pushObject('facebook');
        }
    }
}