TryGhost/Ghost

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

Summary

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

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

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

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

        const newUrl = event.target.value;

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

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

        if (newUrl.match(/(?:twitter\.com\/)(\S+)/) || newUrl.match(/([a-z\d.]+)/i)) {
            let username = [];

            if (newUrl.match(/(?:twitter\.com\/)(\S+)/)) {
                [, username] = newUrl.match(/(?:twitter\.com\/)(\S+)/);
            } else {
                [username] = newUrl.match(/([^/]+)\/?$/mi);
            }

            // check if username starts with http or www and show error if so
            if (username.match(/^(http|www)|(\/)/) || !username.match(/^[a-z\d._]{1,15}$/mi)) {
                const message = !username.match(/^[a-z\d._]{1,15}$/mi)
                    ? 'Your Username is not a valid Twitter Username'
                    : 'The URL must be in a format like https://twitter.com/yourUsername';

                model.errors.add(modelProperty, message);
                model.hasValidated.pushObject(modelProperty);
                return;
            }

            model[modelProperty] = `https://twitter.com/${username}`;
            this.args.setScratchValue?.(null);

            model.hasValidated.pushObject(modelProperty);
        } else {
            const message = 'The URL must be in a format like https://twitter.com/yourUsername';
            model.errors.add(modelProperty, message);
            model.hasValidated.pushObject(modelProperty);
            return;
        }
    }
}