docusign_flutter 0.0.7 copy "docusign_flutter: ^0.0.7" to clipboard
docusign_flutter: ^0.0.7 copied to clipboard

PlatformiOS
outdated

Docusign API for flutter.

example/lib/main.dart

import 'dart:convert';
import 'dart:io';
import 'package:docusign_flutter/model/access_token_model.dart';
import 'package:docusign_flutter/model/account_info.dart';
import 'package:docusign_flutter/model/add_documents_model.dart';
import 'package:docusign_flutter/model/auth_model.dart';
import 'package:docusign_flutter/model/carbon_copy_model.dart';
import 'package:docusign_flutter/model/delete_documents_model.dart';
import 'package:docusign_flutter/model/document_model.dart';
import 'package:docusign_flutter/model/envelope_definition_model.dart';
import 'package:docusign_flutter/model/input_token_model.dart';
import 'package:docusign_flutter/model/recipient_sms_authentication_model.dart';
import 'package:docusign_flutter/model/recipient_view_request_model.dart';
import 'package:docusign_flutter/model/recipients_model.dart';
import 'package:docusign_flutter/model/sign_here_tab_model.dart';
import 'package:docusign_flutter/model/signer_model.dart';
import 'package:docusign_flutter/model/tabs_model.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:docusign_flutter/docusign_flutter.dart';
import 'package:path_provider/path_provider.dart';

String accessToken = r'<<NEED_CHANGE>>';
const String accountId = r'<<NEED_CHANGE>>';
const String email = r'<<NEED_CHANGE>>';
const int expiresIn = 28800;
const String host = r'https://demo.docusign.net/restapi';
const String integratorKey = r'<<NEED_CHANGE>>';
const String userId = r'<<NEED_CHANGE>>';
const String userName = r'<<NEED_CHANGE>>';
const String privateRSAKey = r'''<<NEED_CHANGE>>''';
const String publicRSAKey = r'''<<NEED_CHANGE>>''';

const String envelopeId = r'<<NEED_CHANGE>>';
const String recipientClientUserId = r'1';
const String recipientEmail = r'<<NEED_CHANGE>>';
const String recipientUserName = r'<<NEED_CHANGE>>';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  AccountInfoModel? _accountInfoModel;
  String? _docusignObserver;
  String? _envelopeId;
  String? _modifiedEnvelopeIdDeleteDocument;
  String? _modifiedEnvelopeIdAddDocument;
  String? _modifiedEnvelopeIdCreateTabs;
  String? _modifiedEnvelopeIdUpdatedRecipients;
  String? _deleteEnvelopeId;
  String? _signingUrl;
  String? _documentPath;
  bool? _syncingStatus;
  bool? _offlineSigningStatus;
  AccessTokenModel? _accessTokenModel;

  @override
  void initState() {
    super.initState();
    DocusignFlutter.listenObserver(_onEvent, _onError);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Docusign_flutter'),
        ),
        body: Container(
          margin: const EdgeInsets.all(10),
          child: Builder(builder: (context) {
            return SingleChildScrollView(
              child: Center(
                child: Column(children: [
                  Text('Token status: ${_accessTokenModel?.accessToken}\n'),
                  ElevatedButton(
                    onPressed: () => _getAccessToken(),
                    child: const Text('AccessToken'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text('Auth status:${_accountInfoModel?.email}\n')),
                  ElevatedButton(
                    onPressed: () => _auth(),
                    child: const Text('Auth'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text('Document path :$_documentPath\n')),
                  ElevatedButton(
                    onPressed: () => _getDocument(),
                    child: const Text('Get Document'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text('Envelope Id :$_envelopeId\n')),
                  ElevatedButton(
                    onPressed: () => _createEnvelope(),
                    child: const Text('Create enveloppe'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text('Delete Envelope Id :$_deleteEnvelopeId\n')),
                  ElevatedButton(
                    onPressed: () => _deleteEnvelope(),
                    child: const Text('Delete enveloppe'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text('Signing url :$_signingUrl\n')),
                  ElevatedButton(
                    onPressed: () => _captiveSigning(),
                    child: const Text('Captive signing'),
                  ),
                  ElevatedButton(
                    onPressed: () {},
                    child: const Text('Sign here'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text(
                          'Modified envelope delete : $_modifiedEnvelopeIdDeleteDocument\n')),
                  ElevatedButton(
                    onPressed: () => _deleteDocuments(),
                    child: const Text('Delete documents'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text(
                          'Modified envelope update : $_modifiedEnvelopeIdAddDocument\n')),
                  ElevatedButton(
                    onPressed: () => _addDocuments(),
                    child: const Text('Add documents'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text(
                          'Create recipient tabs : $_modifiedEnvelopeIdCreateTabs\n')),
                  ElevatedButton(
                    onPressed: () => _createRecipientTabs(),
                    child: const Text('Create recipient tabs'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text(
                          'Modified envelope update : $_modifiedEnvelopeIdUpdatedRecipients\n')),
                  ElevatedButton(
                    onPressed: () => _updateRecipients(),
                    child: const Text('Update Recipients'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text(
                          'Offline signing status: ${_convertStatus(_offlineSigningStatus)}\n')),
                  ElevatedButton(
                    onPressed: () => _offlineSigning(),
                    child: const Text('Offline signing'),
                  ),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text('OBSERVER:$_docusignObserver\n')),
                  Padding(
                      padding: const EdgeInsets.only(top: 20),
                      child: Text(
                          'Syncing status: ${_convertStatus(_syncingStatus)}\n')),
                  ElevatedButton(
                    onPressed: () => _syncingEnvelopes(),
                    child: const Text('Syncing'),
                  ),
                ]),
              ),
            );
          }),
        ),
      ),
    );
  }

  Future<void> _getAccessToken() async {
    var inputToken = InputTokenModel(
        url: 'account-d.docusign.com',
        urlPath: '/oauth/token',
        integratorKey: integratorKey,
        userId: userId,
        publicRSAKey: publicRSAKey,
        privateRSAKey: privateRSAKey);
    var result = await DocusignFlutter.getAccessToken(inputToken);
    setState(() {
      _accessTokenModel = result;
      if (result?.accessToken != null) {
        accessToken = result!.accessToken;
      }
    });
  }

  Future<void> _auth() async {
    var authModel = AuthModel(
      accessToken: accessToken,
      expiresIn: expiresIn,
      accountId: accountId,
      email: email,
      host: host,
      integratorKey: integratorKey,
      userId: userId,
      userName: userName,
    );
    var result = await DocusignFlutter.auth(authModel);
    setState(() {
      _accountInfoModel = result;
    });
  }

  Future<void> _createEnvelope() async {
    FilePickerResult? filePickerResult = await FilePicker.platform
        .pickFiles(type: FileType.custom, allowedExtensions: ['pdf']);

    if (filePickerResult != null &&
        filePickerResult.files.single.path != null) {
      File file = File(filePickerResult.files.single.path!);
      Directory directory = await getApplicationDocumentsDirectory();
      File persistedFile = File("${directory.path}/sample.pdf");
      persistedFile.writeAsBytes(await file.readAsBytes());
      List<int> bytes = await file.readAsBytes();

      // documents
      DocumentModel document = DocumentModel(
          documentBase64: base64Encode(bytes),
          documentId: '<<NEED_CHANGE>>',
          fileExtension: '<<NEED_CHANGE>>',
          includeInDownload: false,
          name: '<<NEED_CHANGE>>');
      List<DocumentModel> documents = [document];

      // carbon copies
      CarbonCopyModel carbonCopy = CarbonCopyModel(
          email: '<<NEED_CHANGE>>',
          firstName: '<<NEED_CHANGE>>',
          lastName: '<<NEED_CHANGE>>',
          name: '<<NEED_CHANGE>>',
          recipientId: '<<NEED_CHANGE>>',
          routingOrder: '2',
          status: 'created');
      // sms authentication
      RecipientSmsAuthenticationModel smsAuthentication1 =
          RecipientSmsAuthenticationModel(
              senderProvidedNumbers: ['+33623374798']);
      RecipientSmsAuthenticationModel smsAuthentication2 =
          RecipientSmsAuthenticationModel(
              senderProvidedNumbers: ['<<NEED_CHANGE>>']);
      SignHereTabModel signHereTabModel1 = SignHereTabModel(
          anchorString: '<<NEED_CHANGE>>',
          anchorUnits: '<<NEED_CHANGE>>',
          anchorXOffset: '<<NEED_CHANGE>>',
          anchorYOffset: '<<NEED_CHANGE>>',
          status: 'active');
      SignHereTabModel signHereTabModel2 = SignHereTabModel(
          anchorString: '<<NEED_CHANGE>>',
          anchorUnits: '<<NEED_CHANGE>>',
          anchorXOffset: '<<NEED_CHANGE>>',
          anchorYOffset: '<<NEED_CHANGE>>',
          status: 'active');
      // tabs
      TabsModel tabs1 = TabsModel(signHereTabs: [signHereTabModel1]);
      TabsModel tabs2 = TabsModel(signHereTabs: [signHereTabModel2]);
      // signers
      SignerModel signer1 = SignerModel(
        clientUserId: '1',
        email: '<<NEED_CHANGE>>',
        firstName: '<<NEED_CHANGE>>',
        lastName: '<<NEED_CHANGE>>',
        name: '<<NEED_CHANGE>>',
        recipientId: '<<NEED_CHANGE>>',
        routingOrder: '<<NEED_CHANGE>>',
        smsAuthentication: smsAuthentication1,
        status: '<<NEED_CHANGE>>',
        tabs: tabs1,
        idCheckConfigurationName: 'SMS Auth \$',
        requireIdLookup: true,
      );
      SignerModel signer2 = SignerModel(
        clientUserId: '2',
        email: '<<NEED_CHANGE>>',
        firstName: '<<NEED_CHANGE>>',
        lastName: '<<NEED_CHANGE>>',
        name: '<<NEED_CHANGE>>',
        recipientId: '<<NEED_CHANGE>>',
        routingOrder: '<<NEED_CHANGE>>',
        smsAuthentication: smsAuthentication2,
        status: '<<NEED_CHANGE>>',
        tabs: tabs2,
        idCheckConfigurationName: 'SMS Auth \$',
        requireIdLookup: true,
      );

      // recipients
      RecipientsModel recipients = RecipientsModel(
          carbonCopies: [carbonCopy], signers: [signer1, signer2]);

      EnvelopeDefinitionModel body = EnvelopeDefinitionModel(
          documents: documents,
          emailSubject: '<<NEED_CHANGE>>',
          recipients: recipients,
          status: 'sent');

      var result = await DocusignFlutter.createEnvelope(accountId, body);
      setState(() {
        _envelopeId = result;
      });
    } else {
      // User canceled the picker
    }
  }

  Future<void> _deleteEnvelope() async {
    var result = await DocusignFlutter.deleteEnvelope(
        accountId, '388636bc-6a09-453a-96ee-5746d2b0fc25');
    setState(() {
      _deleteEnvelopeId = result;
    });
  }

  Future<void> _captiveSigning() async {
    RecipientViewRequestModel requestViewRequestModel =
        RecipientViewRequestModel(
            authenticationMethod: "None",
            clientUserId: "<<NEED_CHANGE>>",
            email: "<<NEED_CHANGE>>",
            recipientId: "<<NEED_CHANGE>>",
            returnUrl: "http://www.google.com",
            userName: "<<NEED_CHANGE>>");

    var result = await DocusignFlutter.captiveSigning(
        accountId, _envelopeId ?? '', requestViewRequestModel);
    setState(() {
      _signingUrl = result;
    });
  }

  Future<void> _deleteDocuments() async {
    DeleteDocumentsModel deleteDocumentsModel =
        DeleteDocumentsModel(documentIds: ['1']);

    var result = await DocusignFlutter.deleteDocuments(
        accountId, _envelopeId ?? '', deleteDocumentsModel);
    setState(() {
      _modifiedEnvelopeIdDeleteDocument = result;
    });
  }

  Future<void> _getDocument() async {
    var result = await DocusignFlutter.getDocument(
        accountId, 'e27593fe-909c-43a7-a530-5a981fcc8658', '1');
    setState(() {
      _documentPath = result;
    });
  }

  Future<void> _addDocuments() async {
    Directory directory = await getApplicationDocumentsDirectory();
    File persistedFile = File("${directory.path}/sample.pdf");

    List<int> bytes = await persistedFile.readAsBytes();

    // documents
    DocumentModel document = DocumentModel(
        documentBase64: base64Encode(bytes),
        documentId: '<<NEED_CHANGE>>',
        fileExtension: '<<NEED_CHANGE>>',
        includeInDownload: false,
        name: '<<NEED_CHANGE>>');
    List<DocumentModel> documents = [document];

    AddDocumentsModel addDocumentsModel =
        AddDocumentsModel(documents: documents);

    var result = await DocusignFlutter.addDocuments(
        accountId, _envelopeId ?? '', addDocumentsModel);
    setState(() {
      _modifiedEnvelopeIdAddDocument = result;
    });
  }

  Future<void> _createRecipientTabs() async {
    SignHereTabModel signHereTabModel = SignHereTabModel(
        anchorString: '<<NEED_CHANGE>>',
        anchorUnits: '<<NEED_CHANGE>>',
        anchorXOffset: '<<NEED_CHANGE>>',
        anchorYOffset: '<<NEED_CHANGE>>',
        status: '<<NEED_CHANGE>>');
    // tabs
    TabsModel tabs = TabsModel(signHereTabs: [signHereTabModel]);

    var result = await DocusignFlutter.createRecipientTabs(
        accountId, _envelopeId ?? '', '<<NEED_CHANGE>>', tabs);
    setState(() {
      _modifiedEnvelopeIdCreateTabs = result;
    });
  }

  Future<void> _updateRecipients() async {
    // sms authentication
    RecipientSmsAuthenticationModel smsAuthentication =
        RecipientSmsAuthenticationModel(
            senderProvidedNumbers: ['<<NEED_CHANGE>>']);
    SignHereTabModel signHereTabModel = SignHereTabModel(
        anchorString: '<<NEED_CHANGE>>',
        anchorUnits: '<<NEED_CHANGE>>',
        anchorXOffset: '<<NEED_CHANGE>>',
        anchorYOffset: '<<NEED_CHANGE>>',
        status: '<<NEED_CHANGE>>');
    // tabs
    TabsModel tabs = TabsModel(signHereTabs: [signHereTabModel]);
    // signers
    SignerModel signer = SignerModel(
      clientUserId: '<<NEED_CHANGE>>',
      email: '<<NEED_CHANGE>>',
      firstName: '<<NEED_CHANGE>>',
      lastName: '<<NEED_CHANGE>>',
      name: '<<NEED_CHANGE>>',
      recipientId: '<<NEED_CHANGE>>',
      routingOrder: '<<NEED_CHANGE>>',
      smsAuthentication: smsAuthentication,
      status: '<<NEED_CHANGE>>',
      tabs: tabs,
      idCheckConfigurationName: 'SMS Auth \$',
      requireIdLookup: true,
    );

    // recipients
    RecipientsModel recipients =
        RecipientsModel(carbonCopies: [], signers: [signer]);

    var result = await DocusignFlutter.updateRecipients(
        accountId, _envelopeId ?? '', recipients);
    setState(() {
      _modifiedEnvelopeIdUpdatedRecipients = result;
    });
  }

  void _onEvent(Object? event) {
    setState(() {
      _docusignObserver = event.toString();
    });
  }

  void _onError(Object error) {
    setState(() {
      _docusignObserver = error.toString();
    });
  }

  Future<void> _offlineSigning() async {
    var result = false;
    try {
      await DocusignFlutter.offlineSigning(_envelopeId ?? '');
      result = true;
    } on Exception {
      result = false;
    }

    setState(() {
      _offlineSigningStatus = result;
    });
  }

  Future<void> _syncingEnvelopes() async {
    var result = false;
    try {
      await DocusignFlutter.syncEnvelopes();
      result = true;
    } on Exception {
      result = false;
    }
    setState(() {
      _syncingStatus = result;
    });
  }

  String _convertStatus(bool? status) {
    if (status != null) {
      return status ? 'success' : 'failed';
    }
    return 'none';
  }
}