192 lines
5.1 KiB
C++
192 lines
5.1 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#pragma once
|
|
|
|
#include "passport/passport_form_view_controller.h"
|
|
#include "passport/passport_form_controller.h"
|
|
#include "ui/layers/layer_widget.h"
|
|
|
|
namespace Ui {
|
|
class BoxContent;
|
|
} // namespace Ui
|
|
|
|
namespace Passport {
|
|
|
|
class FormController;
|
|
class Panel;
|
|
|
|
struct EditDocumentCountry;
|
|
struct EditDocumentScheme;
|
|
struct EditContactScheme;
|
|
|
|
enum class ReadScanError;
|
|
|
|
using preferredLangCallback =
|
|
Fn<rpl::producer<EditDocumentCountry>(const QString &)>;
|
|
EditDocumentScheme GetDocumentScheme(
|
|
Scope::Type type,
|
|
std::optional<Value::Type> scansType,
|
|
bool nativeNames,
|
|
preferredLangCallback &&preferredLanguage);
|
|
EditContactScheme GetContactScheme(Scope::Type type);
|
|
|
|
const std::map<QString, QString> &LatinToNativeMap();
|
|
const std::map<QString, QString> &NativeToLatinMap();
|
|
QString AdjustKeyName(not_null<const Value*> value, const QString &key);
|
|
bool SkipFieldCheck(not_null<const Value*> value, const QString &key);
|
|
|
|
struct ScanInfo {
|
|
explicit ScanInfo(FileType type);
|
|
ScanInfo(
|
|
FileType type,
|
|
const FileKey &key,
|
|
const QString &status,
|
|
const QImage &thumb,
|
|
bool deleted,
|
|
const QString &error);
|
|
|
|
FileType type;
|
|
FileKey key;
|
|
QString status;
|
|
QImage thumb;
|
|
bool deleted = false;
|
|
QString error;
|
|
};
|
|
|
|
struct ScopeError {
|
|
enum class General {
|
|
WholeValue,
|
|
ScanMissing,
|
|
TranslationMissing,
|
|
};
|
|
|
|
// FileKey - file_hash error (bad scan / selfie / translation)
|
|
// General - general value error (or scan / translation missing)
|
|
// QString - data_hash with such key error (bad value)
|
|
std::variant<FileKey, General, QString> key;
|
|
QString text;
|
|
};
|
|
|
|
class PanelController : public ViewController {
|
|
public:
|
|
PanelController(not_null<FormController*> form);
|
|
|
|
not_null<UserData*> bot() const;
|
|
QString privacyPolicyUrl() const;
|
|
void submitForm();
|
|
void submitPassword(const QByteArray &password);
|
|
void recoverPassword();
|
|
rpl::producer<QString> passwordError() const;
|
|
QString passwordHint() const;
|
|
QString unconfirmedEmailPattern() const;
|
|
|
|
void setupPassword();
|
|
void cancelPasswordSubmit();
|
|
void validateRecoveryEmail();
|
|
|
|
bool canAddScan(FileType type) const;
|
|
void uploadScan(FileType type, QByteArray &&content);
|
|
void deleteScan(FileType type, std::optional<int> fileIndex);
|
|
void restoreScan(FileType type, std::optional<int> fileIndex);
|
|
rpl::producer<ScanInfo> scanUpdated() const;
|
|
rpl::producer<ScopeError> saveErrors() const;
|
|
void readScanError(ReadScanError error);
|
|
|
|
std::optional<rpl::producer<QString>> deleteValueLabel() const;
|
|
void deleteValue();
|
|
|
|
QString defaultEmail() const;
|
|
QString defaultPhoneNumber() const;
|
|
|
|
void showAskPassword() override;
|
|
void showNoPassword() override;
|
|
void showCriticalError(const QString &error) override;
|
|
void showUpdateAppBox() override;
|
|
|
|
void fillRows(
|
|
Fn<void(
|
|
QString title,
|
|
QString description,
|
|
bool ready,
|
|
bool error)> callback);
|
|
rpl::producer<> refillRows() const;
|
|
|
|
void editScope(int index) override;
|
|
void saveScope(ValueMap &&data, ValueMap &&filesData);
|
|
bool editScopeChanged(
|
|
const ValueMap &data,
|
|
const ValueMap &filesData) const;
|
|
void cancelEditScope();
|
|
|
|
void showBox(
|
|
object_ptr<Ui::BoxContent> box,
|
|
Ui::LayerOptions options,
|
|
anim::type animated) override;
|
|
void showToast(const QString &text) override;
|
|
void suggestReset(Fn<void()> callback) override;
|
|
|
|
int closeGetDuration() override;
|
|
|
|
void cancelAuth();
|
|
void cancelAuthSure();
|
|
|
|
rpl::lifetime &lifetime();
|
|
|
|
~PanelController();
|
|
|
|
private:
|
|
void ensurePanelCreated();
|
|
|
|
void editScope(int index, std::optional<int> documentIndex);
|
|
void editWithUpload(int index, int documentIndex);
|
|
bool editRequiresScanUpload(
|
|
int index,
|
|
std::optional<int> documentIndex) const;
|
|
void startScopeEdit(int index, std::optional<int> documentIndex);
|
|
std::optional<int> findBestDocumentIndex(const Scope &scope) const;
|
|
void requestScopeFilesType(int index);
|
|
void cancelValueEdit();
|
|
void processValueSaveFinished(not_null<const Value*> value);
|
|
void processVerificationNeeded(not_null<const Value*> value);
|
|
|
|
bool savingScope() const;
|
|
bool uploadingScopeScan() const;
|
|
bool hasValueDocument() const;
|
|
bool hasValueFields() const;
|
|
std::vector<ScopeError> collectSaveErrors(
|
|
not_null<const Value*> value) const;
|
|
QString getDefaultContactValue(Scope::Type type) const;
|
|
void deleteValueSure(bool withDetails);
|
|
|
|
void resetPassport(Fn<void()> callback);
|
|
void cancelReset();
|
|
|
|
not_null<FormController*> _form;
|
|
std::vector<Scope> _scopes;
|
|
rpl::event_stream<> _submitFailed;
|
|
std::vector<not_null<const Value*>> _submitErrors;
|
|
rpl::event_stream<ScopeError> _saveErrors;
|
|
|
|
std::unique_ptr<Panel> _panel;
|
|
Fn<bool()> _panelHasUnsavedChanges;
|
|
QPointer<Ui::BoxContent> _confirmForgetChangesBox;
|
|
std::vector<Ui::BoxPointer> _editScopeBoxes;
|
|
Scope *_editScope = nullptr;
|
|
const Value *_editValue = nullptr;
|
|
const Value *_editDocument = nullptr;
|
|
Ui::BoxPointer _scopeDocumentTypeBox;
|
|
std::map<not_null<const Value*>, Ui::BoxPointer> _verificationBoxes;
|
|
|
|
Ui::BoxPointer _resetBox;
|
|
|
|
rpl::lifetime _lifetime;
|
|
|
|
};
|
|
|
|
} // namespace Passport
|